Pandas按Flag分组统计后在函数内生成字典仅保留末次结果如何解决
问题原因分析
- 核心问题是你在循环内部每次都重新创建
sum_dict,会覆盖上一轮循环写入的键值对,最终仅保留最后一次循环(也就是Char3)对应的两个键值对 - 代码中出现了未定义的变量
dref,实际应该是传入的参数dataf,属于笔误 - 函数没有设置返回值,执行完后无法拿到最终生成的统计结果
- 额外优化点:逐行
apply的计算效率很低,实际可以用groupby + transform实现分组聚合结果广播,性能高很多,逻辑也更简洁
修正后可运行代码
import pandas as pd # 原有生成测试DataFrame的逻辑保持不变 data = {'Flag':['a', 'b', 'a', 'b'], 'Item':['ball', 'car', 'pen', 'candy'], 'Char1':[0, 0, 0, 0], 'Char2':[23, 21, 19, 13], 'Char3':[40, 43, 60, 70]} df = pd.DataFrame(data) Flag_list = ['a','b'] def fnctn(dataf): param_list=["Char1", "Char2", 'Char3'] # 提前初始化sum_dict,写入固定的Flag字段,不要在循环内重复创建 sum_dict = {'Flag':Flag_list} for param in param_list: # 用groupby+transform替代apply,高效实现分组聚合结果广播 dataf[f'{param}_avg'] = dataf.groupby('Flag')[param].transform('mean') dataf[f'{param}_StDev'] = dataf.groupby('Flag')[param].transform('std') # 给已有的sum_dict新增键值对,不要覆盖整个字典 sum_dict[f'{param}_average'] = dataf[f'{param}_avg'].head(2).tolist() sum_dict[f'{param}_std'] = dataf[f'{param}_StDev'].head(2).tolist() ref_avg_values = pd.DataFrame(sum_dict) # 返回所有需要的结果:统计字典、结果DataFrame、处理后的原表 return sum_dict, ref_avg_values, dataf dataf = df.copy() sum_dict, ref_df, processed_df = fnctn(dataf) # 打印sum_dict即可得到和非封装版本完全一致的结果 print(sum_dict)
内容的提问来源于stack exchange,提问作者heartbit
相关产品推荐
相关产品推荐

