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

Pandas中aggregate()生成的DataFrame索引异常及绘图报错问题求助

问题解析与解决方案

这个问题的核心其实很简单——你用groupby聚合后,id列并没有"失踪",而是变成了DataFrame的索引(Index),不再是普通的列了,所以你用列名df_new["id"]去访问自然会报KeyError。

为什么会这样?

当你执行df.groupby(df['id']).aggregate(agg_functions)时,id被用作分组的依据键,Pandas默认会把这个分组键设置为结果DataFrame的索引,而不是保留为普通列。你看到的"显示形式不同",就是索引的表现(它会靠左对齐,作为整个DataFrame的行标签)。

解决方法(三种可选)

方法1:直接利用索引绘图(最简单)

既然索引本身就是id的值,Pandas的plot方法默认会把索引作为x轴,所以你完全不需要指定x参数,直接绘制sales的折线图即可:

ax = df_new.plot(kind="line", y="sales")

如果一定要显式指定x轴,你可以传入字符串'index'(注意不是df_new.index对象):

ax = df_new.plot(kind="line", x='index', y="sales")

方法2:把索引转换为普通列(reset_index)

用reset_index()方法可以把当前的索引(也就是id)转换为普通列,同时生成一个默认的整数索引。记得要重新赋值给df_new(或者加inplace=True,但更推荐显式赋值):

# 将索引转为普通列
df_new = df.groupby(df['id']).aggregate(agg_functions).reset_index()
# 现在id是普通列,可以正常用x='id'绘图
ax = df_new.plot(kind="line", x="id", y="sales")

你之前尝试reset_index没效果,大概率是因为没有重新赋值给df_new——Pandas的大多数方法默认返回新对象,不会修改原DataFrame。

方法3:groupby时设置as_index=False(从源头避免问题)

在groupby的时候直接加上as_index=False参数,这样分组键id会直接保留为普通列,不会被设置为索引:

agg_functions = {'employee': 'first', 'sales': 'sum', 'returns': 'sum'}
# 分组时不把id设为索引
df_new = df.groupby(df['id'], as_index=False).aggregate(agg_functions)
# 此时id是普通列,直接绘图即可
ax = df_new.plot(kind="line", x="id", y="sales")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 09:47:37