用Pandas画图遇到的问题(plot、pivot、unstack)

来源:互联网 发布:wps office mac 编辑:程序博客网 时间:2024/06/06 02:46

整理自优达学城课程论坛

背景

在学习优达学城的课程,有一个练习是使用Pandas绘图。

想画的图是:每个UNIT的每天平均气温

  • 按 UNIT 和 DATEn 分组,计算出 tempi 的平均值
  • 但直接使用 plot() 只能画出一条折线的图
%pylab inlineimport matplotlib.pyplot as pltimport seaborn as snsimport pandas as pdfilename = 'nyc-subway-weather.csv'subway_df = pd.read_csv(filename)tempi_by_date_n_unit = subway_df[['UNIT', 'DATEn', 'tempi']]mean = tempi_by_date_n_unit.groupby(['DATEn', 'UNIT']).mean()mean.plot()

气温均值数据(前一小部分):
这里写图片描述

如果直接对 气温均值数据 调用 plot() 画图,会是以下这样:
这里写图片描述

但这不是想要的图。

处理数据

然后各种搜索,最后有一个办法行得通:把 UNIT 和对应的气温均值数据变换成columns

%pylab inlineimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfilename = 'nyc-subway-weather.csv'subway_df = pd.read_csv(filename)tempi_by_date_n_unit = subway_df[['UNIT', 'DATEn', 'tempi']]mean = tempi_by_date_n_unit.groupby(['DATEn', 'UNIT'], as_index=False).mean()new_df = pd.DataFrame(mean['DATEn'].drop_duplicates())for i in mean['UNIT'].drop_duplicates():    i_df = mean[mean['UNIT'].isin([i])][['DATEn', 'tempi']]    new_df = new_df.merge(i_df).rename(columns={'tempi':i})new_df.set_index('DATEn').plot()

出来的效果,跟想要的效果类似,但貌似横坐标少了好多日期数据:
这里写图片描述

这个生成过程有点繁琐。。。

找到 pivot

在论坛中提问后,继续进行搜索,恰好看到一篇文章谈到 轴向旋转,即将行转成列! 就是使用 DataFrame 的 pivot方法:

pivot_mean = mean.pivot(index='DATEn', columns='UNIT', values='tempi')pivot_mean.plot()

这么一行代码,就可以旋转轴向,并画出想要的效果
这里写图片描述

新问题

如果要将多个columns作为index,进行轴向旋转,要怎么做?

对 pivot 进行尝试

%pylab inlineimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsdf = pd.DataFrame({    'cat': ['M','M','M','M','N','N','N','N'],    'foo': ['one','two','three','four','one','two','three','four'],    'bar': ['A', 'B', 'A', 'B', 'A', 'B','A','B'],    'baz': [1, 2, 3, 4, 5, 6,7,8]                  })

这里写图片描述
这里写图片描述
这里写图片描述

想要的效果:以 [‘cat’, ‘foo’] 为 index,转置 bar,然后以 baz 作为 values
这里写图片描述

但我使用 pivot() 会报错,好像是数量对不上,但不知道具体是怎样。官方文档中没找到 multindex 的情况。
这里写图片描述

找到 unstack

后续搜索找到了 unstack() 方法,可以实现上述效果。

df.groupby(['cat', 'foo','bar']).count().unstack()

这里写图片描述

后续

当时的问题 “pivot() 不支持多个index的轴向转置?”,发到了课程论坛中。导师回复如下:
https://stackoverflow.com/questions/35414625/pandas-how-to-run-a-pivot-with-a-multi-index

PS:stackoverflow.com是个好地方! 还有,英语很重要 Orz…