Pandas DataFrame - 将月份转换为日期时间并从多个列中迭代选择数据进行绘图
假设我有一个 pandas 的数据表,格式如下:
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
...
这个表的“月份”这一列一直到 2014 年 4 月。我想为 Thing1
和 Thing2
中的每个项目绘制每月总数的折线图。
我尝试使用 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
中的每个项目绘制每月的时间序列总数呢?
我想应该有办法重新整理这个数据表,这样简单调用 plot()
就能完成这个任务,对吧?
1 个回答
1
这是因为你的“Month”列的数据格式不对。你可以先把“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
的级别,其中 dfgb
是从 groupby
得到的 DataFrame
。然后你可以通过以下方式绘制时间序列:
for item in dfgb.index.get_level_values(1):
dfgb.xs(item, level=1).plot(kind='bar') #for bar graph