You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:48:03