我有一个DataFrame,我正在尝试查找某些事件的发生频率。因此,例如,它列出如下

Month Year Event UniqueID
1     2018 A     01
1     2018 A     02
2     2018 B     03
....


等等。我每年都按活动频率对所有内容进行分组。我通过使用以下代码做到了这一点。

这计算了所有事件,所以我可以平均它们

df.groupby(['Year','Month','Event'])['Event'].size().rename('Count of Events').reset_index()


这给了我们一些类似于

Year Month Event Count of Events
2018 01    A     2
2018 02    B     1
...


然后,通过使用

df.groupby(['Event'])['Count of Events'].mean()


这给了我平均值。但是我注意到的一件事是我可能有差距。例如,事件“ A”可能发生在1月和2月,而不是3月,因此这不会给我一年的真实“平均值”。填补这些孔的最佳方法是什么?例如,在上面的示例列表中,

Month Year Event Count of Events
1     2018 A     02
1     2018 B     00
1     2018 C     00
2     2018 A     00
2     2018 B     00
2     2018 B     01
...


在我平均之前,这将是最佳的最终结果。谢谢!

最佳答案

您已接近解决方案。分组后,将数据框解堆叠为“宽”格式(这样,您将拥有一个月和一年的每种组合),将缺失的值填充为0,然后将其堆叠回去:

df.groupby(["Month", "Year", "Event"]).size().unstack().fillna(0).stack()
#Month  Year  Event
#1      2018  A        2.0
#             B        0.0
#2      2018  A        0.0
#             B        1.0

10-06 00:01