我有一个事件的数据集,每个事件都发生在特定的一天。使用Pandas,我已经能够使用groupby函数将其汇总为每月的事件计数,然后使用Matplotlib绘制图形。但是,在原始数据集中,有些月份没有任何事件,因此在该月份没有事件计数。因此,这些月份并未出现在图表中,但我想以某种方式将其零计数包括在内
bpm2 = df2_yr1.groupby(['month_year', 'month'])['event_no'].count()
产生
month_year month
2016-01 January 9
2016-02 February 7
2016-04 April 1
2016-06 June 4
2016-07 July 1
2016-08 August 3
2016-09 September 2
2016-10 October 5
2016-11 November 17
2016-12 December 3
在这种情况下,我一直试图寻找一种方法来填充由groupby函数生成的数据框中的缺失月份,其“计数”值为0(在此示例中为3月和5月)。
任何人都可以就如何实现这一目标提供一些建议。我一直在尝试在月份列上执行FFill,但收效甚微,无法解决在缺失月份中如何添加相应的零值
答案 0 :(得分:2)
首先,如果bpm2 = df2_yr1.groupby(['month_year', 'month'])['event_no'].count()
是您的代码,则它是一个序列。因此,我们将其更改为带有bpm2 = df2_yr1.groupby(['month_year', 'month'])['event_no'].count().reset_index()
的数据框。现在,问题出了。
更改为日期格式,然后使用pd.Grouper
并更改回字符串格式。还要重新添加month
列并更改event_no
列的格式:
bpm2 = df2_yr1.groupby(['month_year', 'month'])['event_no'].count().reset_index()
bpm2['month_year'] = bpm2['month_year'].astype(str)
bpm2['month_year'] = pd.to_datetime(bpm2['month_year'])
bpm2 = bpm2.groupby([pd.Grouper(key='month_year', freq='1M')])['event_no'].first().fillna(0).astype(int).reset_index()
bpm2['month'] = bpm2['month_year'].dt.strftime('%B')
bpm2['month_year'] = bpm2['month_year'].dt.strftime('%Y-%m')
bpm2
输出:
month_year event_no month
0 2016-01 9 January
1 2016-02 7 February
2 2016-03 0 March
3 2016-04 1 April
4 2016-05 0 May
5 2016-06 4 June
6 2016-07 1 July
7 2016-08 3 August
8 2016-09 2 September
9 2016-10 5 October
10 2016-11 17 November
11 2016-12 3 December