python - pandas groupby 并为各自的总数聚合两列,然后计算比率 - 总结摘要
问题描述
我有以下数据
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
?
上述方法给出了一个关键错误,这可能是由于将原始列名用于聚合列。
解决方案
由于它们相互依赖,我们可以在应用 .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
推荐阅读
- javascript - 本地存储不保留值
- python - 如何在 Python 中将零向量或矩阵添加到 3D 数组
- python - 如何计算给定json的准确性
- linear-algebra - 如何为条件定义一组线性约束:“如果 x1 ≤ 0,则 x2 ≤ 0”?
- python - 使用 while 循环启动和停止线程
- java - Spring错误“名为'x'的Bean应该是'y'类型,但实际上是[com.sun.proxy.$Proxy]类型”
- python - event_loop 在 Django>=3.1 异步视图中存在多长时间
- python - 将列表用作 Pandas 单元格元素
- kotlin - NullPointerException:测试将 Ebean 与 Mockito 和 JUnit、Kotlin 一起使用的 DAO 类
- flutter - Flutter国际化的问题