【问题标题】:Pandas compute datetime diff, but for each userPandas 计算日期时间差异,但针对每个用户
【发布时间】:2018-04-30 19:02:59
【问题描述】:

数据集与用户查看项目所花费的时间有关:

user_id   item_id           view_started
  121        160       2015-10-20 17:02:02
  231        160       2015-10-18 11:02:29
  231        161       2015-10-18 11:05:23
  121        166       2015-10-18 11:04:34
  231        180       2015-10-18 11:06:16
  121        182       2015-10-20 17:02:10
  134        182       2015-10-18 11:02:53
  124        185       2015-10-18 11:04:23
  231        187       2015-10-18 11:04:45
  124        190       2015-10-18 11:05:43

目标是创建用户查看每个项目所花费的时间(或查看项目之间的间隔)。

user_id item_id     minutes
  121     160        4320
  ...

应该计算用户查看过的直接项目之间的差异。示例:X1, X2, X3 | Time between X1-X2, X2-X3... 并且需要重置每个组的时间。我相信使用diff 不是正确的方法。

df.groupby(['user_id']).apply(
            lambda x: x.sort_values(['view_started'], ascending = True))['view_started'].diff()

这给出了第一个值NaT。每个组(每个用户)应该重置时间差

* Time probably don't reflect the above data frame due to sort

0                  NaT
1      0 days 00:08:58
2      0 days 00:04:51
3      0 days 00:06:46
4      0 days 17:05:03
5      0 days 00:00:51
6    -9 days +10:21:49
7      0 days 00:02:33

【问题讨论】:

    标签: python pandas datetime group-by pandas-groupby


    【解决方案1】:

    diff 在这里看起来不错,但您需要做一些家务。首先,对数据进行排序:

    df = df.sort_values(by=['user_id', 'view_started']).reset_index(drop=True)
    

    现在,您可以执行groupby + diff 操作。

    df['minutes'] = (
        df.groupby('user_id', sort=False)
          .view_started
          .diff()
          .dt.total_seconds()
          .div(60)
          .shift(-1)
    )
    

    df
       user_id  item_id        view_started      minutes
    0      121      166 2015-10-18 11:04:34  3237.466667
    1      121      160 2015-10-20 17:02:02     0.133333
    2      121      182 2015-10-20 17:02:10          NaN
    3      124      185 2015-10-18 11:04:23     1.333333
    4      124      190 2015-10-18 11:05:43          NaN
    5      134      182 2015-10-18 11:02:53          NaN
    6      231      160 2015-10-18 11:02:29     2.266667
    7      231      187 2015-10-18 11:04:45     0.633333
    8      231      161 2015-10-18 11:05:23     0.883333
    9      231      180 2015-10-18 11:06:16          NaN
    

    【讨论】:

    • @COLDSPEED shift(-1) 这里的工作是什么?对 NaN 有什么建议,替换为 Avg per user?。
    • @Null-Hypothesis 观看的分钟数应该与实际生成位置上方的条目相关联,因此我将其向上移动。例如,X -> Y 最初会生成 NaN,xyz mins,即使 xyz 与 X 项相关联,而不是 Y。至于 NaN,您可以考虑填充平均值,例如 df.minutes = df.minutes.fillna(df.groupby('user_id').minutes.transform('mean'))。您也可以使用 sklearn 的 imputer,但它无法处理分组填充操作。
    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2016-04-03
    • 2021-11-25
    • 2011-08-01
    • 2016-02-02
    相关资源
    最近更新 更多