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

pandas遍历DataFrame按Description分组求和Amount的代码优化咨询

优化实现方案

你需要的按Description分组对Amount求和、输出csv的需求,pandas有原生的向量化实现方案,不需要手动写循环、做去重判断,代码更简洁且执行效率更高:

# 按Description分组,对Amount列聚合求和
df_hist_data = df.groupby('Description', as_index=False)['Amount'].sum()
# 直接输出为csv文件,不需要手动处理打印和文件写入逻辑
df_hist_data.to_csv(file_to_hist, index=False)

该方案的优势:

  • 自动完成分类去重,不需要自行维护used_list做重复判断
  • groupby是pandas原生的向量化运算,比手动循环遍历的时间复杂度低得多,数据量越大性能优势越明显
  • 直接调用to_csv方法输出文件,不需要修改标准输出、手动拼接逗号分隔符,也能避免Description字段本身包含逗号导致的格式错误
现有代码的问题说明

第一段可运行代码的问题

  • 手动修改sys.stdout的写法存在很高的隐患:代码执行完成后没有恢复标准输出,后续所有的print内容都会被写入到目标文件中,容易产生隐蔽的逻辑错误
  • 循环遍历每个Description再逐次调用.loc查询的逻辑时间复杂度为O(n²),数据量较大时运行速度会非常慢

第二段代码Amount列全为NaN的原因

pandas的append方法(注:新版本pandas已经弃用该接口,更推荐使用pd.concat)接收的单行数据是单个字典参数,你将两个字段拆成了两个独立字典传入,第二个字典被识别为ignore_index参数,因此只有Description字段被写入到了新DataFrame中,Amount字段完全没有被识别,自然全为NaN值。
你原来的错误写法:

# 错误写法:拆分传入两个独立字典
df_hist_data = df_hist_data.append({'Description' : i}, {'Amount' : df.loc[df['Description'] == i, 'Amount'].sum()})

将两个字段合并到同一个字典中即可正常运行(仅做错误原因说明,仍优先推荐使用groupby方案):

df_hist_data = df_hist_data.append({'Description' : i, 'Amount' : df.loc[df['Description'] == i, 'Amount'].sum()}, ignore_index=True)

内容的提问来源于stack exchange,提问作者kartoshka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:06:03