熊猫:带有multiIndex数据帧的条形图

mar*_*ion 6 python matplotlib pandas

我有一个带有TIMESTAMP列(不是索引)的pandas DataFrame,时间戳格式如下:

2015-03-31 22:56:45.510
Run Code Online (Sandbox Code Playgroud)

我也有名为CLASS和的列AXLES.我想为每个唯一值分别计算每个月的记录数AXLES(AXLES可以取3-12之间的整数值).

我想出的组合resamplegroupby:

resamp = dfWIM.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS
Run Code Online (Sandbox Code Playgroud)

这似乎给了我一个multiIndex数据帧对象,如下所示.

In [72]: resamp

Out [72]:

AXLES  TIMESTAMP 
3      2014-07-31      5517
       2014-08-31     31553
       2014-09-30     42816
       2014-10-31     49308
       2014-11-30     44168
       2014-12-31     45518
       2015-01-31     54782
       2015-02-28     52166
       2015-03-31     47929
4      2014-07-31      3147
       2014-08-31     24810
       2014-09-30     39075
       2014-10-31     46857
       2014-11-30     42651
       2014-12-31     48282
       2015-01-31     42708
       2015-02-28     43904
       2015-03-31     50033
Run Code Online (Sandbox Code Playgroud)

从这里,如何访问此multiIndex对象的不同组件以创建以下条件的条形图?

  • 当AXLES = 3时显示数据
  • 以月 - 年格式显示x刻度(无日,小时,分钟等)

谢谢!

编辑:以下代码给我的情节,但我无法将xtick格式更改为MM-YY.

resamp[3].plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

下面的编辑2是一个代码片段,它生成一个类似于我的数据的小样本:

dftest = {'TIMESTAMP':['2014-08-31','2014-09-30','2014-10-31'], 'AXLES':[3, 3, 3], 'CLASS':[5,6,7]}
dfTest = pd.DataFrame(dftest)
dfTest.TIMESTAMP = pd.to_datetime(pd.Series(dfTest.TIMESTAMP))
resamp = dfTest.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS
resamp[3].plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

编辑3: 以下是解决方案:

A.绘制整个重采样数据帧(基于@Ako的建议):

df = resamp.unstack(0)
df.index = [ts.strftime('%b 20%y') for ts in df.index]
df.plot(kind='bar', rot=0)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

B.从重新采样的数据帧中绘制单个索引(基于@Alexander的建议):

df = resamp[3]
df.index = [ts.strftime('%b 20%y') for ts in df.index]
df.plot(kind='bar', rot=0)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Ale*_*der 1

以下应该可行,但如果没有一些数据就很难测试。

首先重置索引以访问该TIMESTAMP列。然后使用strftime将其格式化为您想要的文本表示形式(例如 mm-yy)。最后,将索引重置回AXLESTIMESTAMP

df = resamp.reset_index()
df['TIMESTAMP'] = [ts.strftime('%m-%y') for ts in df.TIMESTAMP]
df.set_index(['AXLES', 'TIMESTAMP'], inplace=True)
>>> df.xs(3, level=0).plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述