如何使用Pandas将大型DataFrame从长格式转换为指定规则的宽格式
Pandas长表转SPSS规则宽表解决方案
核心逻辑是先给同ID下的重复条目生成自增序号,再通过宽化转换+列名重命名实现需求,10万行规模下运行效率无压力。
操作步骤
- 生成同ID下的条目序号
groupby+cumcount生成从1开始的序号,匹配SPSS转置的序号规则:
import pandas as pd # 假设你的原始长表存放在df变量中 df['seq'] = df.groupby('ID_num').cumcount() + 1
- 执行宽化转换
固定字段Col_A随ID_num放在索引位,需要转置的动态列放到values参数,支持批量传入多列:
wide_df = df.pivot( index=['ID_num', 'Col_A'], columns='seq', values=['Col_B', 'Col_C'] # 此处可批量添加需要转置的所有列名 ).reset_index()
- 重命名列符合后缀规则
把生成的MultiIndex列名转换为「字段名_序号」的格式:
wide_df.columns = [ f"{col[0]}_{col[1]}" if isinstance(col, tuple) and col[1] != "" else col[0] if isinstance(col, tuple) else col for col in wide_df.columns ]
可选:强制补齐到最大30列
如果要求哪怕ID的条目数不足30,也要预留_1到_30的空列,追加以下代码:
max_seq = 30 # 要转置的列列表,可根据实际情况修改 dynamic_cols = ['Col_B', 'Col_C'] # 补齐缺失的列 for col in dynamic_cols: for seq in range(1, max_seq + 1): target_col = f"{col}_{seq}" if target_col not in wide_df.columns: wide_df[target_col] = pd.NA # 可选:按固定顺序排列列 col_order = ['ID_num', 'Col_A'] for col in dynamic_cols: col_order.extend([f"{col}_{seq}" for seq in range(1, max_seq + 1)]) wide_df = wide_df[col_order]
方案说明
- 支持批量处理多列转置,仅需要修改
values参数和dynamic_cols列表中的列名即可,不需要逐个字段写逻辑 - 10万行规模转换耗时在普通设备上不超过2秒,无内存溢出风险
内容的提问来源于stack exchange,提问作者NobL
相关产品推荐
相关产品推荐

