繁体   English   中英

Pandas DataFrame-将月份转换为日期时间,并从多个列中反复选择数据进行绘图

[英]Pandas DataFrame - convert months to datetime and iteratively select data from multiple columns for plotting

假设我有一个格式为pandas的DataFrame:

     Month Thing1 Thing2       Tot
0   Jan-12      A      Z  0.005880
1   Jan-12      A      Z  0.024500
...
20  Jan-12      B      Y  0.001533
21  Jan-12      C      X  0.003892
22  Jan-12      C      X  0.001680
23  Jan-12      C      X  0.001680
24  Jan-12      C      X  0.001680
25  Jan-12      C      X  0.001680
26  Jan-12      A      W  0.001680
27  Jan-12      D      V  0.013440
28  Jan-12      E      U  0.001680
...

月列将统一为14年4月。 我正在尝试为Thing1Thing2每个项目的每月总计绘制折线图。

我正在尝试使用groupby

a=pd.read_csv('all2.csv')
sums=a.groupby([u'Month',u'Thing1',u'Thing2']).sum()

这给了我:

Apr-12 A      W         6.427773
              Z         4.347471
       B      T         7.062425
              Y        17.183562
       C      X        14.583337
       D      V         0.114450
       E      U         0.008050
       F      Q         0.000490
              R         0.004468
       G      P         0.010932
       ...

但是,按字母顺序显示月份。 我的问题是:

如何让Pandas将月份列视为日期时间对象?

如何遍历Thing1列并绘制Thing2每个项目的每月时间序列总计?

我想象有一种重组Dataframe的方法,这样对plot()的简单调用就可以完成工作?

这是因为您的“月”列不在正确的dtype 您可以通过首先将“ Month列转换为日期时间格式来获得预期的结果:

df['Month']=pd.to_datetime(df.Month) ,然后调用df.groupby([u'Month',u'Thing1',u'Thing2']).sum()

但请注意, Pandas不知道Jan-12意味着2014-01-12还是2012-01 ,默认情况下会将您的数据转换为前者。 要获取后者,请为.to_datetime提供format='%b-%y'参数。

对于第二个问题,可以通过dfgb.index.get_level_values(1)获得Thing1的级别。 其中dfgbgroupbyDataFrame 然后可以通过以下方式绘制时间序列:

for item in dfgb.index.get_level_values(1):
    dfgb.xs(item, level=1).plot(kind='bar') #for bar graph

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM