我面临以下挑战。我有以下数据框,称为: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的初学者
谢谢!
答案 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
不是日期时间的列(就熊猫而言,它只是字符串),但仍可以按字典顺序进行排序。
使用by
,aggcol
和**kwargs
是使您的函数更通用的一种方法,如果您希望对其他列名进行分组。如果没有,您也可以按照问题的方式将其硬编码到函数主体中。 **kwargs
可让您将任何其他关键字参数传递给groupby()