用多年绘制pandas数据帧

时间:2017-01-13 05:48:41

标签: python pandas plot

       error   Months    Year
0  15.198688      Jan  2011.0
1  13.793969  Jan_Feb  2011.0
2  15.171848  Jan_Mar  2011.0
3   5.779007  Jan_Apr  2011.0
4   1.615044  Jan_May  2011.0
5   1.536096  Jan_Jun  2011.0
6   1.159742  Jan_Jul  2011.0
0   1.697396      Jan  2012.0
1   5.149847  Jan_Feb  2012.0
2   0.876639  Jan_Mar  2012.0
3   1.865001  Jan_Apr  2012.0
4   0.333077  Jan_May  2012.0
5   2.056728  Jan_Jun  2012.0
0   9.676028      Jan  2013.0
1   3.919200  Jan_Feb  2013.0
2   4.171534  Jan_Mar  2013.0
3   2.318090  Jan_Apr  2013.0
4   0.786901  Jan_May  2013.0
5   0.936041  Jan_Jun  2013.0
6   0.115029  Jan_Jul  2013.0

有没有办法在上面绘制pandas数据框,以便绘图有3行(3个独特年份各有一行)。 Y轴有“错误”列,X轴显示月份。传奇应该是3年:2011年,2012年,2013年

对于X轴,如果month是'Jan_Feb',那么label应该只是'Feb'。如果月份是'Jan',那么标签应该说'Jan'

我尝试了df.plot(),但它在一个情节中绘制了所有内容

2 个答案:

答案 0 :(得分:1)

您可以先进行一些数据清理 - 将years投放到intmonths投放到ordered categorical,以便按月进行正确排序,然后按pivot重新塑造,如果需要,可以用某个值替换NaN,例如fillna0

df.Year = df.Year.astype(int)
df.Months = df.Months.str[-3:].astype('category', 
                                      ordered=True, 
                                      categories=['Jan','Feb','Mar','Apr','May','Jun','Jul'])

df = df.pivot(index='Months', columns='Year', values='error').fillna(0)
print (df)
Year         2011      2012      2013
Months                               
Jan     15.198688  1.697396  9.676028
Feb     13.793969  5.149847  3.919200
Mar     15.171848  0.876639  4.171534
Apr      5.779007  1.865001  2.318090
May      1.615044  0.333077  0.786901
Jun      1.536096  2.056728  0.936041
Jul      1.159742  0.000000  0.115029

df.plot()

graph

正确排序的另一种可能解决方案是list中按订购月份的reindex

df.Year = df.Year.astype(int)
df.Months = df.Months.str[-3:]
df = df.pivot(index='Months', columns='Year', values='error')
       .fillna(0)
       .reindex(['Jan','Feb','Mar','Apr','May','Jun','Jul'])

print (df)
Year         2011      2012      2013
Months                               
Jan     15.198688  1.697396  9.676028
Feb     13.793969  5.149847  3.919200
Mar     15.171848  0.876639  4.171534
Apr      5.779007  1.865001  2.318090
May      1.615044  0.333077  0.786901
Jun      1.536096  2.056728  0.936041
Jul      1.159742  0.000000  0.115029

答案 1 :(得分:0)

注意到在此数据集中,可以从索引中识别月份,即。 [0..6] - > [Jan..Jul],应使用以下代码生成所需的绘图:

plt = df.pivot(values='error', columns='Year').plot()

但是,现在x轴刻度文本是数字。我们可以使用以下方法解决这个问题:

plt.set_xticklabels(['Jan','Feb','Mar','Apr','May','Jun','Jul'])