我有以下挑战。我有以下数据格式,名为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因此,在本质上,页面浏览量应该是在时间戳之后累积起来的。在运行累积和公式之前,我应该先对时间戳上的数据进行排序吗?还是我该做点别的?
ps:我是蟒蛇/熊猫的初学者。
提前感谢!
发布于 2018-10-26 16:36:13
你离我很近--你只需要给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而言,只是字符串),但它仍然能够按字典顺序排序。
如果您想对其他列名进行分组,那么使用by、aggcol和**kwargs可以使您的函数更具通用性。如果没有,您也可以像在您的问题中所做的那样,将这些硬编码到函数体中。**kwargs允许您将任何附加关键字参数传递给groupby()。
https://stackoverflow.com/questions/53012893
复制相似问题