熊猫groupby并填写缺失的频率

时间:2020-07-16 11:15:47

标签: pandas group-by missing-data

我有一个事件的数据集,每个事件都发生在特定的一天。使用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,但收效甚微,无法解决在缺失月份中如何添加相应的零值

1 个答案:

答案 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