Pandas基于多标签复合键实现长表转宽表及自定义列名的问题
Pandas长表转宽表实现方案
完整可运行代码
import pandas as pd # 你的原始输入数据 df_input = pd.DataFrame( {'datatype':['IN','IN','EX','EX','IN','IN','EX','EX'], 'Time': [0,0,0,0,1,1,1,1], 'filetype': ['img','txt','img','txt','img','txt','img','txt']}, index=['PMSN01001','PMSN01001','PMSN01001','PMSN01001','PMSN01001','PMSN01001','PMSN01001','PMSN01001'] ) # 步骤1:给同分组下的多个filetype添加序号,避免pivot出现重复索引报错 df_input['file_seq'] = df_input.groupby([df_input.index, 'datatype', 'Time']).cumcount() + 1 # 步骤2:将索引转为普通列,作为宽表的行主键 df_input = df_input.reset_index(names='id') # 步骤3:执行pivot转换 # index参数:配置你的复合主键,多个字段直接放列表即可,比如['id', '其他主键字段'] # columns参数:配置你要拆分到列的分组维度 # values参数:配置你要展示为列值的字段 df_wide = df_input.pivot( index='id', columns=['Time', 'datatype', 'file_seq'], values=['datatype', 'Time', 'filetype'] ) # 步骤4:将多层列索引转为直观的单层列名,可自由调整拼接规则 # 示例拼接规则:[字段名]_time[Time值]_[datatype值]_[file序号],你可以按需求调整顺序和格式 df_wide.columns = [f"{col[0]}_time{col[1]}_{col[2]}_{col[3]}" for col in df_wide.columns] # 可选:如果需要移除重复的Time列,同个Time的Time值完全相同,只保留一个即可 # drop_cols = [c for c in df_wide.columns if c.startswith('Time_') and not c.endswith('_IN_1')] # df_wide = df_wide.drop(drop_cols, axis=1) print(df_wide)
关键问题说明
- 复合主键配置:
pivot方法的index参数直接传入主键列名的列表即可,不需要额外配置,代码会自动按你指定的多个主键分组聚合。 - 直观列名设置:pivot转换后默认生成多层列索引,只需要通过列表推导式将多层索引的各段按你想要的规则拼接为字符串,就能得到辨识度极高的列名,不需要复杂的列名重写逻辑,你可以根据自己的阅读习惯调整拼接顺序和分隔符。
- 兼容性:该方案可以自动适配最多8条(2×2×2)的分组组合,新增不同的
datatype/Time/filetype取值也会自动生成对应列,不需要修改转换逻辑。
内容的提问来源于stack exchange,提问作者Won Chul Chung
相关产品推荐
相关产品推荐

