如何用零填充 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 列表的缺失日期?的主要内容,如果未能解决你的问题,请参考以下文章