我有一个如下所示的数据框:
userid date count
a 2016-12-01 4
a 2016-12-03 5
a 2016-12-05 1
b 2016-11-17 14
b 2016-11-18 15
b 2016-11-23 4
第一列是用户 ID,第二列是日期(由 groupby(pd.TimeGrouper('d')) 产生,第三列是每日计数。但是,对于每个用户,我想确保每个用户的最小和最大日期之间缺少的任何天数都填充为 0。因此,如果我从上述数据框开始,我最终会得到这样的数据框:
userid date count
a 2016-12-01 4
a 2016-12-02 0
a 2016-12-03 5
a 2016-12-04 0
a 2016-12-05 1
b 2016-11-17 14
b 2016-11-18 15
b 2016-11-19 0
b 2016-11-20 0
b 2016-11-21 0
b 2016-11-22 0
b 2016-11-23 4
我知道有多种方法可用于 Pandas 数据框进行重新采样(可以选择向前、向后或通过平均进行插值),但我将如何在上述意义上做到这一点,我想要一个连续的时间序列为每个userid 但每个用户的时间序列日期不同?
这是我尝试过但没有奏效的方法:
grouped_users = user_daily_counts.groupby('user').set_index('timestamp').resample('d', fill_method = None)
但是,这会引发错误
AttributeError: Cannot access callable attribute 'set_index' of 'DataFrameGroupBy' objects, try using the 'apply' method
。我不确定如何能够使用 apply
方法,同时按照我的意愿提出所有列。感谢您的任何建议!
最佳答案
您可以将 groupby
与 resample
一起使用,但首先需要 Datetimeindex
创建的 set_index
。
( need pandas 0.18.1 and higher
)
然后用 NaN
用 0
用 asfreq
填充 fillna
。
最后删除列 userid
和 reset_index
:
df = df.set_index('date')
.groupby('userid')
.resample('D')
.asfreq()
.fillna(0)
.drop('userid', axis=1)
.reset_index()
print (df)
userid date count
0 a 2016-12-01 4.0
1 a 2016-12-02 0.0
2 a 2016-12-03 5.0
3 a 2016-12-04 0.0
4 a 2016-12-05 1.0
5 b 2016-11-17 14.0
6 b 2016-11-18 15.0
7 b 2016-11-19 0.0
8 b 2016-11-20 0.0
9 b 2016-11-21 0.0
10 b 2016-11-22 0.0
11 b 2016-11-23 4.0
如果想要列
count
整数的 dtype 添加 astype
:df = df.set_index('date') \
.groupby('userid') \
.resample('D') \
.asfreq() \
.fillna(0) \
.drop('userid', axis=1) \
.astype(int) \
.reset_index()
print (df)
userid date count
0 a 2016-12-01 4
1 a 2016-12-02 0
2 a 2016-12-03 5
3 a 2016-12-04 0
4 a 2016-12-05 1
5 b 2016-11-17 14
6 b 2016-11-18 15
7 b 2016-11-19 0
8 b 2016-11-20 0
9 b 2016-11-21 0
10 b 2016-11-22 0
11 b 2016-11-23 4
关于python - pandas DataFrame 以每组为基础对每日数据进行插值/重新采样,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40998220/