【问题标题】:pandas DataFrame interpolating/resampling daily data on a per-group basispandas DataFrame 按组对每日数据进行插值/重采样
【发布时间】:2016-12-06 23:10:40
【问题描述】:

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

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 数据帧有多种方法可以重新采样(可以选择向前、向后或通过平均进行插值),但是在上述意义上,我将如何做到这一点,我想要一个连续的时间每个用户 ID 的系列,但每个用户的时间系列日期不同?

这是我尝试过但没有奏效的方法:

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 方法,同时按照我的意愿提出所有列。

感谢您的任何建议!

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    您可以将groupbyresample 一起使用,但首先需要由set_index 创建的Datetimeindex
    (need pandas 0.18.1 and higher)

    然后用fillna 填充NaN by 0 by asfreq

    最后删除列useridreset_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
    

    【讨论】:

    • 谢谢!我没有考虑对 set_index 重新排序,实际上它总是让我感到困惑,因为有重复的日期,但以某种方式将它们设置为索引仍然有效?
    • 是的,但每个组必须是唯一的。感谢您的接受。
    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2015-09-08
    • 2021-12-14
    • 2023-02-24
    • 2013-12-06
    • 2012-10-02
    相关资源
    最近更新 更多