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

