如何用零填充 pandas groupby 列表的缺失日期?

Posted

技术标签:

【中文标题】如何用零填充 pandas groupby 列表的缺失日期?【英文标题】:How do I fill in missing dates with zeros for a pandas groupby list? 【发布时间】:2019-11-01 08:57:35 【问题描述】:

我希望记录交易的每日记录,并记录发生 0 次交易的天数。

这是我的初始数据框:

df.head()
tr_timestamp  text      location
2016-01-01    cookies   TX
2016-01-01    pizza     TX
2016-01-04    apples    TX
2016-01-08    bread     TX

当我每天运行一个小组时,我会得到以下信息:

df_by_day = df['tr_timestamp'].groupby(df.tr_timestamp).count()
df_by_day

tr_timestamp
2016-01-01  2
2016-01-04  1
2016-01-08  1

我希望使用 Python/Pandas 填充没有交易的日期,以便获得以下输出:

df_by_day_filled

tr_timestamp
2016-01-01  2
2016-01-02  0
2016-01-03  0
2016-01-04  1
2016-01-05  0
2016-01-06  0
2016-01-07  0
2016-01-08  1

我尝试了以下答案,但并不能完全给出我需要返回的输出:

Pandas groupby for zero values

Fill Missing Dates in DataFrame with Duplicate Dates in Groupby

谢谢。

【问题讨论】:

【参考方案1】:

这是一个resample 操作:

df.set_index(pd.to_datetime(df.pop('tr_timestamp'))).resample('D')['text'].count()

tr_timestamp
2016-01-01    2
2016-01-02    0
2016-01-03    0
2016-01-04    1
2016-01-05    0
2016-01-06    0
2016-01-07    0
2016-01-08    1
Freq: D, Name: text, dtype: int64

如果“tr_timestamp”不是日期时间,pd.to_datetime 调用可确保此方法有效。如果是,则解决方案简化为

df.dtypes

tr_timestamp    datetime64[ns]
text                    object
location                object
dtype: object

df.set_index('tr_timestamp').resample('D')['text'].count()

tr_timestamp
2016-01-01    2
2016-01-02    0
2016-01-03    0
2016-01-04    1
2016-01-05    0
2016-01-06    0
2016-01-07    0
2016-01-08    1
Freq: D, Name: text, dtype: int64

【讨论】:

【参考方案2】:

你也可以试试:

df_by_day.asfreq('D', fill_value=0)

输出:

tr_timestamp
2016-01-01    2
2016-01-02    0
2016-01-03    0
2016-01-04    1
2016-01-05    0
2016-01-06    0
2016-01-07    0
2016-01-08    1
Freq: D, Name: tr_timestamp, dtype: int64

【讨论】:

以上是关于如何用零填充 pandas groupby 列表的缺失日期?的主要内容,如果未能解决你的问题,请参考以下文章

我如何用 pandas.groupby() 总结时间戳

如何用前导零填充数组?

如何用零填充数组?

python如何用零填充numpy数组

如何用 0(零)填充整数? [复制]

如何用 seaborn 绘制 pandas 三列(用 group by 计算)