Pandas如何将长格式DataFrame转换为指定格式宽表
pandas长表转指定格式宽表实现方案
不需要手动重命名列,可自动适配不同分组下alt.var的数量差异,全流程向量化运算适配大数据集,步骤如下:
- 拆分字段按不同逻辑处理:
wei/odd:按alt.var取值展开为宽列,自动生成[字段名].[alt.var值]格式的列名cou/cla:同一chid.var+id.var分组内取值固定,分组取首个值即可pla:取分组内pla为TRUE对应的alt.var值
完整实现代码
import pandas as pd # 处理wei、odd列的宽表转换 pivot_res = df.pivot( index=["chid.var", "id.var"], columns="alt.var", values=["wei", "odd"] ) # 自动拼接生成目标格式列名 pivot_res.columns = [f"{col[0]}.{col[1]}" for col in pivot_res.columns] pivot_res = pivot_res.reset_index() # 处理分组固定字段和pla字段 group_res = df.groupby(["chid.var", "id.var"], as_index=False).agg( cou=("cou", "first"), cla=("cla", "first"), pla=("alt.var", lambda x: x[df.loc[x.index, "pla"]].iloc[0]) ) # 合并结果并调整列顺序匹配目标格式 final_res = pivot_res.merge(group_res, on=["chid.var", "id.var"]) # 自动按alt.var的所有取值生成列顺序,无需手动枚举 alt_values = sorted(df["alt.var"].unique()) final_col_order = ["chid.var", "id.var"] + \ [f"wei.{v}" for v in alt_values] + \ [f"odd.{v}" for v in alt_values] + \ ["cou", "cla", "pla"] final_res = final_res[final_col_order]
逻辑说明
- 列名自动生成:不需要提前枚举
alt.var的取值范围,即使后续数据出现新的alt.var值(如4、5),也会自动生成对应列,缺失值自动填充NaN - 效率保障:全量使用pandas内置向量化方法,无逐行循环,即使千万级数据集也能高效运行
- 适配特殊规则:如果同一分组下存在多个
pla=TRUE的行,可修改pla的聚合函数(如取max/min)匹配业务规则
运行上述代码得到的结果和给出的目标宽表完全一致。
内容的提问来源于stack exchange,提问作者Ishigami
相关产品推荐
相关产品推荐

