使用pandas计算月中的总事件数

时间:2014-01-07 07:47:33

标签: python pandas

我的数据帧使用groupby(代码,ID,日期),如下所示 -

Code    ID  Date              Sum
100 200 2012-05-31   50
                2012-06-07   60
                2012-06-25   70
                2012-06-26   80
                2013-06-27   85
                2013-06-28   90

我想创建一个数据框,可以用groupby(代码,ID,月/年)显示数据 -

Code    ID     Month/Year     Sum
100     200    May/2012        50
               June/2012       210
               June/2013       175

请告知

1 个答案:

答案 0 :(得分:2)

您可以每个月对resample进行一次。

因此,首先将“日期”列转换为日期时间:

df['Date'] = pd.to_datetime(df['Date'])

然后将其设置为索引,在['Code', 'ID']上分组,然后对每个组应用resample

df.set_index('Date').groupby(['Code', 'ID']).resample('M', 'sum')

In [6]: df = pd.DataFrame({'Code':100, 'ID':200, 'Date':pd.date_range("2012-01-01", periods=10, freq='10D'), 'Sum':np.random.randint(10, size=10)})

In [7]: df
Out[7]:
   Code                Date   ID  Sum
0   100 2012-01-01 00:00:00  200    1
1   100 2012-01-11 00:00:00  200    9
2   100 2012-01-21 00:00:00  200    5
3   100 2012-01-31 00:00:00  200    9
4   100 2012-02-10 00:00:00  200    8
5   100 2012-02-20 00:00:00  200    3
6   100 2012-03-01 00:00:00  200    9
7   100 2012-03-11 00:00:00  200    8
8   100 2012-03-21 00:00:00  200    3
9   100 2012-03-31 00:00:00  200    5

In [8]: df.set_index('Date').groupby(['Code', 'ID']).resample('M', 'sum')
Out[8]:
                     Code   ID  Sum
Code ID  Date
100  200 2012-01-31   400  800   24
         2012-02-29   200  400   11
         2012-03-31   400  800   25

要绘制它,这样的事情应该这样做:

fig, ax = plt.subplots()

for name, group in df.set_index('Date').groupby(['Code', 'ID']):
    group['Sum'].resample('M', 'sum').plot(ax=ax, label=name)

但是你也可以进一步研究你的结果,'unstack'(将索引级别带到列中),然后绘制:

df2 = df.set_index('Date').groupby(['Code', 'ID']).resample('M', 'sum')
df2['Sum'].unstack([0,1]).plot()