首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大熊猫创建新栏目

问大熊猫创建新栏目
EN

Stack Overflow用户
提问于 2018-10-26 16:29:27
回答 1查看 514关注 0票数 0

我有以下挑战。我有以下数据格式,名为defined_conversions:

代码语言:javascript
复制
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的额外列,该列接受每个用户的页面浏览量的累积和。

我构建这个功能就是为了实现这一点:

代码语言:javascript
复制
def pageviews_per_user(defined_conversions):
    defined_conversions['sum_pageviews'] = defined_conversions.groupby(['user_id'])['pageviews'].cumsum
    return defined_conversions

我担心的是数据文件会是这样的:

代码语言:javascript
复制
   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

我想让它看起来像:

代码语言:javascript
复制
  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:我是蟒蛇/熊猫的初学者。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-26 16:36:13

你离我很近--你只需要给cumsum()打电话

代码语言:javascript
复制
>>> df.sort_values([by, 'timestamp']).groupby('user_id')['pageviews'].cumsum()
0     3
1     7
2    14
3     2
4     4
Name: pageviews, dtype: int64

作为一项职能:

代码语言:javascript
复制
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,而且会就地修改它。

下面是如何使用该函数:

代码语言:javascript
复制
>>> 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()。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53012893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档