在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你可以保持其他列的first
或last
值通过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 数据框聚合