Pandas使用groupby与aggregate后索引异常导致绘图失败的问题求助
问题根源
当你执行df.groupby(df['id']).aggregate(...)时,id列会被自动设置为结果DataFrame的索引(Index),而不是普通的列。这就是为什么你看到id在显示时和其他列格式不同——它不属于df_new.columns的一部分,所以用df_new["id"]访问会触发KeyError。
解决方案
这里有两种简单的方法解决你的绘图问题:
方法1:把索引转回普通列
使用reset_index()方法将索引转换为常规列,这样id就可以像其他列一样被访问:
# 在聚合后调用reset_index() df_new = df.groupby(df['id']).aggregate(agg_functions).reset_index() # 现在可以正常指定x='id'绘图 ax = df_new.plot(kind="line", x="id", y="sales")
执行后df_new的结构会变成:
id employee sales returns 0 101 Dan 5 3 1 102 Rick 3 2 2 103 Ken 10 6
方法2:直接用索引作为x轴绘图
Pandas的plot()方法默认会将DataFrame的索引作为x轴,所以你不需要显式指定x参数,只需要指定要绘制的y列即可:
# 默认用索引(id)作为x轴,直接指定y列 ax = df_new.plot(kind="line", y="sales") # 可选:自定义x轴标签 ax.set_xlabel("id")
为什么你之前的尝试失败?
- 用
x=df_new["id"]报错:因为id是索引,不是列,所以不在df_new.columns中,自然找不到这个键。 - 用
x=df_new.index报错:plot()的x参数接受的是列名字符串,而不是索引对象。如果你想用索引当x轴,要么直接省略x参数(方法2),要么先把索引转成列(方法1)。
另外你提到reset_index()没效果,大概率是因为没有重新赋值给df_new——Pandas的大部分方法默认返回新对象,不会修改原对象,所以需要写成df_new = df_new.reset_index()才会生效。
内容的提问来源于stack exchange,提问作者Rerun
相关产品推荐
相关产品推荐

