Pandas透视时行列组合转列头固定输出列数的实现方法
Pandas透视固定生成Part1-Part8全量列实现方案
不需要追加虚拟行再做清理,透视完成后直接通过列重索引补全要求的字段即可,代码更简洁、执行效率更高。
完整代码
# 保留原有透视逻辑 s = df.pivot_table( index=['Machine', 'Time'], columns=df.Part.astype(str).radd('Part'), values=['PowerA', 'PowerB'], fill_value=-1 ).swaplevel(1, 0, axis=1).sort_index(level=0, axis=1) s.columns = s.columns.map('_'.join) s.reset_index(inplace=True) # 生成规则内的全量固定列名:Part1~Part8分别匹配PowerA、PowerB两个指标 full_metric_cols = [f'Part{i}_{metric}' for i in range(1, 9) for metric in ['PowerA', 'PowerB']] # 对齐列,缺失列自动填充为-1 s = s.reindex(columns=['Machine', 'Time'] + full_metric_cols, fill_value=-1)
逻辑说明
- 原有透视逻辑无需改动,先生成源数据中实际存在的Part对应的指标列
- 按业务规则预生成全部16个必填指标的列名,列顺序固定为Part1_PowerA、Part1_PowerB依次类推直到Part8_PowerB
- 调用
reindex方法做列对齐:传入包含索引列(Machine、Time)和全量指标列的列列表,源数据中不存在的列会被自动创建,通过fill_value=-1参数直接将缺失值统一填充为要求的-1,无需额外做缺失值替换操作
运行结果
Machine Time Part1_PowerA Part1_PowerB Part2_PowerA Part2_PowerB Part3_PowerA Part3_PowerB Part4_PowerA Part4_PowerB Part5_PowerA Part5_PowerB Part6_PowerA Part6_PowerB Part7_PowerA Part7_PowerB Part8_PowerA Part8_PowerB 0 1 20:30 0.1 0.4 0.9 0.7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 20:31 0.3 0.1 0.2 0.3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 2 20:30 0.2 0.5 -1.0 -1.0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 2 20:31 0.8 0.4 -1.0 -1.0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
内容的提问来源于stack exchange,提问作者Kunis
相关产品推荐
相关产品推荐

