基于Pandas分组聚合计算用户总会话数、总浏览量及平均浏览量
解决按用户分组统计会话数、浏览量及每会话平均浏览量的问题
我来帮你搞定这个分组统计的问题!你需要按user_id分组,计算总会话数(total_sessions,即每个用户的唯一会话ID数量)、总浏览量(total_views,即每个用户的youtube记录总数),再算出每会话平均浏览量,咱们一步步来修正代码并实现需求:
问题分析
你之前的代码尝试直接在聚合后用apply计算比值,但有个关键问题:聚合时没有给结果列指定正确的名称,导致后续引用x['total_views']会抛出KeyError。我们需要先通过命名聚合得到清晰的统计列,再计算平均值。
完整实现代码
import pandas as pd # 先构造示例数据(如果你的df已经存在可以跳过这部分) data = [ [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.DataFrame(data, columns=['user_id', 'session_id', 'youtube_id']) # 1. 分组聚合,得到总会话数和总浏览量 agg_df = df.groupby('user_id').agg( total_sessions=('session_id', 'nunique'), # 统计每个用户的唯一会话数 total_views=('youtube_id', 'count') # 统计每个用户的总浏览记录数 ) # 2. 计算每会话平均浏览量 agg_df['average_view_per_session'] = agg_df['total_views'] / agg_df['total_sessions'] # 3. 可选:把user_id从索引转为列,方便输出成预期的格式 result_df = agg_df.reset_index() # 查看结果 print(result_df)
运行结果
输出会完全符合你的预期:
user_id total_sessions total_views average_view_per_session 0 1 2 3 1.5 1 2 3 6 2.0
关键细节说明
- 使用
agg()的命名聚合语法(pandas 0.25版本及以上支持),可以直接给聚合后的结果列指定我们需要的名称(total_sessions、total_views),避免后续引用时出现名称错误。 - 计算平均值时,直接用列之间的除法即可,比
apply更简洁高效。 - 如果需要把结果导出为CSV格式,直接用
result_df.to_csv('output.csv', index=False)就能得到你想要的逗号分隔格式。
内容的提问来源于stack exchange,提问作者add-semi-colons
相关产品推荐
相关产品推荐

