如何消除Pandas DataFrame多级索引,设置普通列名以方便绘图
解决Pandas多级列名问题,轻松实现绘图
这个多级列名确实挺烦人的,尤其是要绘图的时候!我给你两个简单的解决办法,一个是从源头避免生成多级列,另一个是修改已经生成的df的列名:
方法一:聚合阶段直接指定列名(推荐)
在agg的时候用字典形式指定每一列的聚合规则和新列名,这样就不会生成带Lifeexp的多级索引了,一步到位:
# 直接在聚合时定义列名,避免多级索引 df = sample[['Place','Lifeexp']].groupby('Place').agg( count=('Lifeexp', 'count'), mean=('Lifeexp', 'mean'), max=('Lifeexp', 'max'), min=('Lifeexp', 'min') ).reset_index() # 排序操作不变 df = df.sort_values('count', ascending=False)
这样生成的df列名就是Place、count、mean、max、min,直接就能执行df.plot.bar(x = "Place", y = 'count')绘图了。
方法二:修改已生成的多级列名
如果已经得到了带多级列的df,可以直接重新设置列名,或者通过列表推导式处理:
方式1:直接赋值列名(简单直观)
看你给出的列索引顺序,直接按顺序赋值新列名即可:
# 重新设置列名 df.columns = ['Place', 'count', 'mean', 'max', 'min'] # 之后排序和绘图都正常 df = df.sort_values('count', ascending=False) df.plot.bar(x = "Place", y = 'count')
方式2:通用处理多级列名
如果列的顺序不确定,用列表推导式自动提取有效列名:
# 遍历多级列名,保留Place,提取Lifeexp下的子列名 df.columns = [col[1] if col[0] == 'Lifeexp' else col[0] for col in df.columns]
两种方法都能帮你去掉Lifeexp层级,让列名变得简洁,轻松完成绘图操作~
内容的提问来源于stack exchange,提问作者user27074
相关产品推荐
相关产品推荐

