cumsum pandas创建新列

时间:2018-10-26 16:29:27

标签: python pandas cumsum

我面临以下挑战。我有以下数据框,称为:define_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的初学者

谢谢!

1 个答案:

答案 0 :(得分:3)

您接近了–您只需打电话 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不是日期时间的列(就熊猫而言,它只是字符串),但仍可以按字典顺序进行排序。

使用byaggcol**kwargs是使您的函数更通用的一种方法,如果您希望对其他列名进行分组。如果没有,您也可以按照问题的方式将其硬编码到函数主体中。 **kwargs可让您将任何其他关键字参数传递给groupby()