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而言),它仍然可以按字典顺序排序。
如果您想对其他列名进行分组,使用 by
、aggcol
和 **kwargs
可以使您的函数更具通用性。如果没有,您也可以像在问题中所做的那样将它们硬编码到函数体中。 **kwargs
允许您将任何其他关键字参数传递给 groupby()
我有以下挑战。我有以下数据框: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而言),它仍然可以按字典顺序排序。
如果您想对其他列名进行分组,使用 by
、aggcol
和 **kwargs
可以使您的函数更具通用性。如果没有,您也可以像在问题中所做的那样将它们硬编码到函数体中。 **kwargs
允许您将任何其他关键字参数传递给 groupby()