首页 > 解决方案 > pandas groupby 并填补缺失的频率

问题描述

我有一个事件数据集,每个事件都发生在特定的一天。使用 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 函数生成的数据框中缺失的月份,在这个例子中,3 月和 5 月的“计数”值为 0。

任何人都可以就如何实现这一点提供一些建议。我一直在尝试在月份列上执行 FFill,但收效甚微,无法弄清楚如何为缺失的月份添加相应的零值

标签: pandasgroup-bymissing-data

解决方案


首先,如果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

推荐阅读