Pandas长格式DataFrame转带层级列头宽表的实现方法
长表转含不等长明细的多层列头宽表实现方案
pivot_table自带聚合逻辑,仅适合汇总统计场景,无法保留全量原始明细,按以下操作即可实现需求:
实现步骤
- 为每个分组内的明细数据添加组内行序号
由于不同试验组的数据点数量不一致,需要先给同组(同rd、ppi、trial)的每条数据分配从0开始的连续序号,作为宽表对齐的行索引:df['row_id'] = df.groupby(['rd', 'ppi', 'trial']).cumcount() - 调用
pivot完成转置
直接使用无聚合逻辑的pivot方法转置,再按需调整列层级顺序即可:# 基础转置 wide_df = df.pivot( index='row_id', columns=['rd', 'ppi', 'trial'], values=['ext', 'load'] ) # 调整列层级为 rd -> ppi -> trial -> 指标(ext/load),不需要可省略 wide_df = wide_df.swaplevel(0, 3, axis=1)\ .swaplevel(0, 2, axis=1)\ .swaplevel(0, 1, axis=1)\ .sort_index(axis=1)
效果说明
- 所有原始明细数据100%保留,不会做任何均值、计数类聚合计算
- 列头自动生成要求的多层级结构,层级顺序可通过
swaplevel自由调整 - 不同组数据量不一致时,数据量不足的位置自动填充
NaN,不会报错或丢失长组数据
以提供的示例数据运行后,输出结构如下:
rd 7% 12% ppi 5_ppi 10_ppi 5_ppi 10_ppi trial trial_1 trial_2 trial_1 trial_2 trial_1 trial_2 trial_1 trial_2 row_id 0 ext 0.287997 load 0.874457 ext 0.015054 load 0.886801 ext 0.291621 load 0.519084 ext 0.349199 load 0.235718 ext 0.725747 load 0.688157 ext 0.534276 load 0.794199 ext 0.494404 load 0.246841 ext 0.791440 load 0.372119 1 ext 0.783776 load 0.878291 ext 0.243617 load 0.234560 ext 0.627786 load 0.072551 ext 0.284535 load 0.328547 ext 0.656839 load 0.297645 ext 0.680596 load 0.381575 ext 0.148489 load 0.549250 ext 0.078047 load 0.552541
内容的提问来源于stack exchange,提问作者J. Day
相关产品推荐
相关产品推荐

