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

Pandas DataFrame列选择触发KeyError,按psychic_id汇总price报错“KeyError: id”求助

解决按psychic_id汇总price时的KeyError问题

首先,你的代码出现KeyError: id和后续的索引错误,主要有两个核心问题:

1. 循环逻辑完全错误

你写的for i in df2其实是在遍历DataFrame的列名(比如'id'、'psychic_id'这些字符串),而不是行索引。所以当你尝试用df2['psychic_id'][i]时,相当于用列名去索引行,自然会触发KeyError。而且就算你改成遍历行索引,这种逐行比较相邻行的逻辑也站不住脚——同一个psychic_id可能不连续,最后一行还会出现i+1越界的问题。

2. 可能原数据不存在'id'列

你创建df2时指定了包含'id'列,但如果原DataFramedf_consultation里根本没有这个列,就会生成全NaN的列,虽然你用fillna(0)把它改成了0,但这也是不必要的隐患,建议先确认原数据的列:

print(df_consultation.columns)

正确的实现方式(用pandas原生分组聚合)

Pandas专门提供了groupby功能来做这种分组求和,效率比手动循环高太多,逻辑也更清晰:

方法1:给原DataFrame添加每个psychic_id的总收益列

如果你想让每一行都显示对应psychic_id的总price,可以用transform方法:

# 先创建df2,只保留原数据存在的列(如果原数据没有'id'就去掉)
df2 = df_consultation[['psychic_id','start','end','duration','price','satisfaction','created_at','updated_at','duration_available']].copy()
df2 = df2.fillna(0)

# 按psychic_id分组,计算price的总和,并映射回每一行
df2['tot_gain_€'] = df2.groupby('psychic_id')['price'].transform('sum')

方法2:生成单独的汇总结果表

如果你只需要每个psychic_id对应的总收益,直接用groupby+sum即可:

df2 = df_consultation[['psychic_id','price']].copy()
df2 = df2.fillna(0)

# 分组求和并重置索引
summary_df = df2.groupby('psychic_id')['price'].sum().reset_index()
# 重命名列名
summary_df.columns = ['psychic_id', 'tot_gain_€']

print(summary_df)

这样既不会有KeyError,也能完美实现按psychic_id汇总price的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:57:28