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

0 投票
1 回答
560 浏览
提问于 2025-04-18 03:07

假设我有一个 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 月。我想为 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 中的每个项目绘制每月的时间序列总数呢?

我想应该有办法重新整理这个数据表,这样简单调用 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

撰写回答