【问题标题】:cumsum pandas create new column [duplicate]cumsum pandas创建新列[重复]
【发布时间】:2018-10-26 16:29:27
【问题描述】:

我有以下挑战。我有以下数据框:defined_conversions

user_id    pageviews    conversion    timestamp
1          3            True          08:01:12
1          4            False         07:02:14
1          7            False         08:02:14
2          2            True          10:12:15
2          2            False         05:12:18

我想要实现的是添加一个名为 sum_pageviews 的附加列,它获取每个用户的综合浏览量的累积总和。

我构建了这个函数来实现这个:

def pageviews_per_user(defined_conversions):
    defined_conversions['sum_pageviews'] = defined_conversions.groupby(['user_id'])['pageviews'].cumsum
    return defined_conversions

我担心的是数据框会是这样的:

   user_id    pageviews    conversion    timestamp    sum_pageviews
    1          3            True          08:01:12    14
    1          4            False         07:02:14    14
    1          7            False         08:02:14    14
    2          2            True          10:12:15    4
    2          2            False         05:12:18    4

我希望它看起来像:

  user_id    pageviews    conversion    timestamp    sum_pageviews
    1          3            True          08:01:12    3
    1          4            False         07:02:14    7
    1          7            False         08:02:14    14
    2          2            True          10:12:15    2
    2          2            False         05:12:18    4

所以本质上,综合浏览量应该在时间戳之后累积。在运行 cumsum 公式之前,我应该先按时间戳对数据进行排序吗?还是我应该做点别的?

ps:我是 python/pandas 的初学者

提前致谢!

【问题讨论】:

    标签: python pandas cumsum


    【解决方案1】:

    你已经很接近了——你只需要致电cumsum():

    >>> df.sort_values([by, 'timestamp']).groupby('user_id')['pageviews'].cumsum()
    0     3
    1     7
    2    14
    3     2
    4     4
    Name: pageviews, dtype: int64
    

    作为一个函数:

    def pageviews_per_user(df, by='user_id', aggcol='pageviews', **kwargs):
        df.sort_values([by, 'timestamp'], inplace=True)
        df['sum_pageviews'] = df.groupby(by=by, sort=False, **kwargs)[aggcol].cumsum()
        return df
    

    请注意,这不仅会返回 DataFrame,还会就地修改它。


    以下是您将如何使用该功能:

    >>> df
       user_id  pageviews  conversion timestamp
    0        1          3        True  08:01:12
    1        1          4       False  07:02:14
    2        1          7       False  08:02:14
    3        2          2        True  10:12:15
    4        2          2       False  05:12:18
    >>> def pageviews_per_user(df, by='user_id', aggcol='pageviews', **kwargs):
    ...     df.sort_values([by, 'timestamp'], inplace=True)
    ...     df['sum_pageviews'] = df.groupby(by=by, **kwargs)[aggcol].cumsum()
    ...     return df
    ... 
    >>> pageviews_per_user(df)
       user_id  pageviews  conversion timestamp  sum_pageviews
    1        1          4       False  07:02:14              4
    0        1          3        True  08:01:12              7
    2        1          7       False  08:02:14             14
    4        2          2       False  05:12:18              2
    3        2          2        True  10:12:15              4
    >>> df
       user_id  pageviews  conversion timestamp  sum_pageviews
    1        1          4       False  07:02:14              4
    0        1          3        True  08:01:12              7
    2        1          7       False  08:02:14             14
    4        2          2       False  05:12:18              2
    3        2          2        True  10:12:15              4
    

    虽然timestamp 不是日期时间列(就 Pandas 而言只是字符串),但它仍然可以按字典顺序排序。

    如果您想对其他列名进行分组,使用byaggcol**kwargs 可以使您的函数更通用。如果没有,您也可以像在您的问题中所做的那样将它们硬编码到函数体中。 **kwargs 允许您将任何其他关键字参数传递给 groupby()

    【讨论】:

    • 感谢 Brad 的回答,代码有效,但看起来非常先进,考虑到我的 Python 水平,我更愿意从更简单的解决方案开始。我可以稍微调整一下自己的代码以使其正常工作吗?本质上:时间戳应该从早到晚排序:用户每分钟都有可能查看一个页面。只有每个用户的最新时间戳才能获得该值:conversion = true,此后每个用户没有后续会话(时间戳)。因此,我希望综合浏览量根据时间戳累计。
    • @julien1337 我添加了更多细节和解释。除此之外,祝你好运!
    猜你喜欢
    • 2019-02-04
    • 2020-09-16
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2020-10-02
    相关资源
    最近更新 更多