pandas - 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,但收效甚微,无法弄清楚如何为缺失的月份添加相应的零值
解决方案
首先,如果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
推荐阅读
- ios - SwiftUI 中的旋转效果
- python - Pytorch 数据集。一旦捕获异常,项目似乎没有添加到列表中
- sql - 如何使数据库能够相互连接?
- javascript - 在不记录用户的情况下修改数据库的方法?
- list - SwiftUI:使用 LazyVStack 而不是列表时,如何从待办事项列表中删除项目/检查项目?
- coq - 如何推广 iff 的 Coq 证明?
- django - django 找不到完整的 url 但可以找到路径
- excel - TextBox 将日期格式从 dd/mm/yy 交换为 mm/dd/yy
- python - 在 Maplotlib Pyplot 中调整条形宽度
- ios - BLE:如何获得正确的服务 UUID 和特征 UUID?