pandas groupby 并为各自的总数聚合两列,然后计算比率 - 总结摘要
Posted
技术标签:
【中文标题】pandas groupby 并为各自的总数聚合两列,然后计算比率 - 总结摘要【英文标题】:pandas groupby and aggregate two columns for respective totals, then calculate ratio - summarize the summary 【发布时间】:2018-10-18 23:17:11 【问题描述】:我有以下数据
user_id session_id youtube_id
1 1 2342
1 1 3523
1 2 3325
2 1 3423
2 1 2352
2 1 3333
2 2 2351
2 2 9876
2 3 2388
目标是按user_id
分组并计算每个用户total_sessions
、total_views
和average views per session
。
user_id, total_sessions, total_views, average_view_per_session
1, 2, 3, 1.5
2, 3, 6, 2
result_df['avg'] = df.groupby('user_id').agg(
'session_id':lambda x : x.nunique(),
'youtube_id': 'count').apply(lambda x : x['total_views']/x['total_sessions']
上面的两个问题:
-
生成的列仍命名为
session_id
和 youtube_id
,尽管它们是聚合
如何进行division
获取average_view_per_session
?
上述方法给出了一个关键错误,这可能是由于将原始列名用于聚合列。
【问题讨论】:
重命名聚合Naming returned columns in Pandas aggregate function中的列 所以你想聚合得到各自的总数,然后得到它们的比率来得到平均值,即“总结”你的总结。我试图改写以使这一点更清楚。 【参考方案1】:由于它们相互依赖,我们可以在应用 .agg() 后将其添加到单独的代码行中。
这个怎么样(完整示例)
import pandas as pd
data = '''\
user_id session_id youtube_id
1 1 2342
1 1 3523
1 2 3325
2 1 3423
2 1 2352
2 1 3333
2 2 2351
2 2 9876
2 3 2388'''
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
df = df.groupby('user_id').agg('session_id': 'nunique', 'youtube_id': 'count')
df.columns = ['total sessions','total views']
df['average view per session'] = df['total views']/df['total sessions']
print(df)
返回:
total sessions total views average view per session
user_id
1 2 3 1.5
2 3 6 2.0
【讨论】:
缺少from io import StringIO
@smci 谢谢,但实际上没有必要。一直使用pd.compat.StringIO()
进行演示。它应该适用于 py2 和 py3。
你不是说“新列”而不是“行”吗?
@smci 我的意思是一个新行(如在新的代码行中)。这确实是牵强附会。已编辑,谢谢。
是时候整理一下哪个导入了:Should we use pandas.compat.StringIO or Python 2/3 StringIO?以上是关于pandas groupby 并为各自的总数聚合两列,然后计算比率 - 总结摘要的主要内容,如果未能解决你的问题,请参考以下文章
数据分析—Pandas 中的分组聚合Groupby 高阶操作