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

