【问题标题】:pandas groupby and filling in missing frequenciespandas groupby 并填补缺失的频率
【发布时间】:2020-07-16 11:15:47
【问题描述】:

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

【问题讨论】:

  • df2_yr1.groupby(['month_year', 'month'])['event_no'].size()?

标签: pandas group-by missing-data


【解决方案1】:

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

【讨论】:

  • 可能,OP 可以使用.reset_index() 转换为数据帧。
  • 感谢大卫。当我运行代码时,我收到以下错误,Ithink 与第一行相关..'TypeError:传递 PeriodDtype 数据无效。请改用data.to_timestamp()'。我正在关注这方面的帖子以尝试解决它
  • 不幸的是仍然得到 . 'TypeError: 传递 PeriodDtype 数据无效。现在使用 data.to_timestamp() 代替'
  • 谢谢大卫。这已经整理出了错误消息,现在生成了我想要的输出。我有很多东西要学!!
  • @TrevP ,您的数据看起来像是 PeriodDtype 格式。您不能使用 pd.to_datetime 直接将特定数据类型更改为日期格式,因此您必须先将其更改为字符串,然后才能使用 pd.to_datetime。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 2015-01-08
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2018-06-04
  • 1970-01-01
相关资源
最近更新 更多