Pandas:不使用groupby/apply将分组转为JSON列表(大数据优化)
优化百万级DataFrame分组转JSON列表的方案
针对300万+行的DataFrame,原groupby+apply方案因逐组Python循环导致效率极低,可通过以下两种更高效的方式实现需求:
方法一:先转每行字典再分组聚合列表
这种方式将逐行处理替代逐组处理,利用groupby.agg的矢量化聚合能力提升速度:
# 1. 将目标列转为每行的字典,生成临时列 item_df['temp_dict'] = item_df[["BarCode", "Description", "Category", "Code", "Quantity", "Price"]].apply(lambda x: x.to_dict(), axis=1) # 2. 按分组键聚合字典列表,生成结果 result = item_df.groupby(['BarCode_x', 'Extracted_Code', 'Unique_Code_x'])['temp_dict'].agg(list).reset_index(name='Grouped') # 可选:删除临时列 item_df.drop('temp_dict', axis=1, inplace=True)
方法二:优化groupby聚合逻辑
如果不想生成临时列,可直接对分组后的列使用列表推导替代to_dict("records"),减少组级循环开销:
result = item_df.groupby(['BarCode_x', 'Extracted_Code', 'Unique_Code_x'])[["BarCode", "Description", "Category", "Code", "Quantity", "Price"]].agg( lambda x: [row.to_dict() for _, row in x.iterrows()] ).reset_index(name='Grouped')
性能提升原理
原方案中groupby.apply(lambda group: group.to_dict("records"))会对每个分组单独调用to_dict,涉及大量组级别的Python循环;优化后的方案要么先完成逐行字典转换(一次循环)再做矢量化聚合,要么用更轻量的列表推导替代全组转字典操作,大幅减少了Python层面的循环开销,通常能将处理时间从小时级压缩到分钟级。
内容的提问来源于stack exchange,提问作者Animeartist
相关产品推荐
相关产品推荐

