基于click_share_rank实现Pandas DataFrame长表转宽表
解决长转宽格式的高效实现方案
针对1400万行的大数据量,直接用pd.pivot_table易出现内存溢出或格式不符预期的问题,推荐以下两种高效实现方式:
方法一:GroupBy + 聚合展开(内存友好)
通过分组聚合为列表再拆分列的方式,规避pivot操作的高内存开销:
import pandas as pd # 读取数据时指定紧凑数据类型,大幅降低内存占用 df = pd.read_csv("sourcefile.csv", dtype={ "department": "category", "search_term": "category", "sfr": "category", "click_share_rank": "int8", "click_share": "float32", "conversion_share": "float32" }) # 按分组键排序,确保每组内rank为1、2、3的固定顺序 df = df.sort_values(["department", "search_term", "sfr", "click_share_rank"]) # 分组后将目标字段聚合为列表 grouped = df.groupby(["department", "search_term", "sfr"])[ ["asin", "clicked_item", "click_share", "conversion_share"] ].agg(list).reset_index() # 将列表拆分为对应rank的列 rank_cols = [1,2,3] for col in ["asin", "clicked_item", "click_share", "conversion_share"]: for rank in rank_cols: grouped[f"{col}_{rank}"] = grouped[col].str[rank-1] grouped.drop(col, axis=1, inplace=True) # 输出结果 grouped.to_csv("desired-output.csv", index=False)
进阶优化:
若内存仍不足,可使用pd.read_csv的chunksize参数分批读取处理,每批完成分组聚合后合并最终结果。
方法二:Pivot + 列名重命名(逻辑直观)
若内存足够支撑,可直接用pivot操作后整理列名:
import pandas as pd df = pd.read_csv("sourcefile.csv", dtype={"department": "category", "search_term": "category", "sfr": "category"}) # 执行pivot转换 pivoted = df.pivot( index=["department", "search_term", "sfr"], columns="click_share_rank", values=["asin", "clicked_item", "click_share", "conversion_share"] ).reset_index() # 将多级列名合并为目标格式(如asin_1、asin_2) pivoted.columns = [f"{col[0]}_{col[1]}" if col[1] != "" else col[0] for col in pivoted.columns] # 输出结果 pivoted.to_csv("desired-output.csv", index=False)
注意事项:
需确保每组的click_share_rank恰好为1、2、3三个值,否则会出现缺失列或额外列;大数据量下优先推荐方法一。
内容的提问来源于stack exchange,提问作者Samuel Sam
相关产品推荐
相关产品推荐

