我有一个如下所示的数据框:

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/

10-11 15:28
查看更多