在pandas中使用groupby和聚合的最佳方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在pandas中使用groupby和聚合的最佳方法相关的知识,希望对你有一定的参考价值。

我有一个名为客户端的表,我想显示有人根据用户ID注册或购买了多少次。

目标是有一个表格,显示registration_complete的总和,并根据用户ID购买

这是我写的代码。不幸的是并非所有列都显示出来

  new_file= new_data.groupby(['userid']) 
  ['Registration_Complete','Purchase'].agg('sum')
  new_file.head(5)

这是我用来确定注册并基于用户ID购买的表

 Event_day  timestamp        install  userid  registration   purchase
 1/1/1900   1/1/1900 16:10    yes     555221     1               0
 1/1/1900   1/1/1900 16:12    yes     555221     1               1
 2/19/2010  1/19/2010 16:40   no      533211     0               1
 2/19/2010  1/19/2016 16:53   yes     533211     0               1
 2/20/2017  2/20/2017 15:46   yes     53200      1               0
 3/15/2017  3/15/2018 15:48   yes     53200      1               0
 3/15/2017  3/15/2018 20:14   yes     53200      1               0

我想要一些可以给我总和的东西

Event_day  timestamp        install  userid  registration   purchase
1/1/1900   1/1/1900 16:10    yes     555221     2               0
2/19/2010  1/19/2016 16:53   yes     533211     0               2
3/15/2017  3/15/2018 20:14   yes     53200      5               0
答案

IIUC你可以保持其他列的firstlast值通过dict到agg

agg = 'Event_day': 'last', 'timestamp': 'last', 'install': 'last', 'registration': 'sum', 'purchase': 'sum'
df.groupby('userid').agg(agg).reset_index()

    userid  Event_day   timestamp       install registration    purchase
0   53200   3/15/2017   3/15/2018 20:14 yes     3               0
1   533211  2/19/2010   1/19/2016 16:53 yes     0               2
2   555221  1/1/1900    1/1/1900 16:12  yes     2               1

编辑:

请记住,有几个答案可能是正确的,我觉得在它们之间进行性能测试很有意思

计时

dfg1 = df.groupby("userid")["install", "timestamp", "Event_day"].max()
dfg2 = df.groupby("userid").sum()
pd.concat([dfg1, dfg2], axis=1)

每回路38.5 ms±393μs(平均值±标准偏差,7次运行,每次10次循环)

first_other_columns = df[['Event_day', 'timestamp', 'install',  'userid']].drop_duplicates(['userid'], keep='first')
grouped = df.groupby(['userid']).sum().reset_index()
pd.merge(grouped, first_other_columns, on=['userid'])

每循环11.3 ms±100μs(平均值±标准偏差,7次运行,每次100次循环)

agg = 'Event_day': 'last', 'timestamp': 'last', 'install': 'last', 'registration': 'sum', 'purchase': 'sum'
df.groupby('userid').agg(agg).reset_index()

每循环6.85 ms±62.5μs(平均值±标准偏差,7次运行,每次100次循环)

另一答案

您可以使用以下内容:

import pandas as pd

first_other_columns = new_file[['Event_day', 'timestamp', 'install',  'userid']].drop_duplicates(['userid'], keep='first')
grouped = new_file.groupby(['userid']).sum().reset_index()
grouped = pd.merge(grouped, first_other_columns, on=['userid'])

这将允许您保留第一个时间戳,event_day并安装和分组用户ID。

让我知道!我希望它有所帮助。 BR

另一答案

您希望其他数据列发生什么?通过获得其他列的最大值,这样的东西似乎接近你想要的东西。

dfg1 = df.groupby("userid")["Event_day", "timestamp", "install"].max()
dfg2 = df.groupby("userid").sum()
pd.concat([dfg1, dfg2], axis=1)

产量

        Event_day timestamp install  registration  purchase
userid                                                     
53200   3/15/2018     20:14     yes             3         0
533211  1/19/2016     16:53     yes             0         2
555221   1/1/1900     16:12     yes             2         1



以上是关于在pandas中使用groupby和聚合的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

数据分析—Pandas 中的分组聚合Groupby 高阶操作

Pandas 0.18.1 groupby 和多级聚合错误重新采样

python pandas - 处理嵌套 groupby 的最佳方法

在列*和*索引上使用 groupby 并与 pandas 数据框聚合

使用 pandas GroupBy 和时间序列重采样的平均聚合

Pandas groupby 在保留多个聚合的组内排序