我的数据帧使用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
请告知
答案 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()