Pandas如何避免使用for循环批量处理分组任务并存储结果到字典
方案1:字典推导式(最推荐,效率最高)
你原来的显式for循环遍历3个分组键的开销本身极低,用字典推导式可以在等价效率下写出更简洁的代码,完全满足生成目标字典的需求:
import pandas as pd df = pd.DataFrame({'y':[1,2,3,4,5,6,7,8,9,10],'key1':[1,1,2,2,3,3,4,4,5,5],'key2':[1,2,1,2,1,2,1,2,1,2],'key3':[1,1,1,1,1,2,2,2,2,2]}) def processing(df, grpId): df_res = df.groupby([grpId]).agg({'y':'sum'}) return df_res # 直接用字典推导式生成结果字典,无需显式for循环 grp_list = ['key1', 'key2', 'key3'] df_dict = {grp: processing(df, grp) for grp in grp_list}
方案2:基于apply实现(符合你要求的apply写法)
如果你一定要用apply逻辑实现,可以把分组键列表转为Series后调用apply,再转成字典:
import pandas as pd df = pd.DataFrame({'y':[1,2,3,4,5,6,7,8,9,10],'key1':[1,1,2,2,3,3,4,4,5,5],'key2':[1,2,1,2,1,2,1,2,1,2],'key3':[1,1,1,1,1,2,2,2,2,2]}) def processing(df, grpId): df_res = df.groupby([grpId]).agg({'y':'sum'}) return df_res grp_list = ['key1', 'key2', 'key3'] # 把分组键转成Series,apply执行处理,最后转字典 df_dict = pd.Series(grp_list).apply(lambda x: processing(df, x)).set_axis(grp_list).to_dict()
补充优化建议:如果你的
processing函数内有多个分组键通用的前置计算逻辑,可以把这部分逻辑抽出来提前执行,避免每个分组键都重复计算,能进一步提升整体运行效率。
内容的提问来源于stack exchange,提问作者user1769197
相关产品推荐
相关产品推荐

