cumsum pandas 创建新列

cumsum pandas create new column

我有以下挑战。我有以下数据框: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

我担心的是 dataframe 看起来像这样:

   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

的初学者

提前致谢!

你很接近——你只需要呼叫 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

请注意,这不仅会 return 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()