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
相关产品推荐
相关产品推荐

