如何匹配story_id列并正确计算视频用户观看百分比?
解决Pandas计算视频观看占比时的索引匹配问题
问题核心
你的原代码拆分了观看数和总记录数的计算逻辑,虽然两者的索引都是story_id,但value_counts()默认按计数降序排列,而groupby.sum()则遵循story_id在原数据中的出现顺序。虽然Pandas会按索引对齐执行除法,但这种分散计算的方式很容易因为索引顺序差异导致结果误解,更稳妥的做法是在同一个分组操作内完成所有统计,确保索引完全匹配。
修复方案
场景1:每条记录对应唯一用户-视频交互
如果你的数据里,每一行都是一个用户对某个视频的唯一交互记录(无重复用户同视频多条记录),用这个方法:
# 一次分组完成观看数、总数统计,索引自动对齐 stats = df.groupby('story_id').agg( 观看人数=('status', lambda x: (x == 3).sum()), 总人数=('status', 'count') ) # 计算观看占比 stats['观看占比'] = stats['观看人数'] / stats['总人数']
场景2:存在用户同视频多条交互记录
如果数据中有同一用户对同一视频的多条操作记录,需要统计唯一用户数而非记录数:
stats = df.groupby('story_id').agg( 观看用户数=('user_id', lambda x: x[df.loc[x.index, 'status'] == 3].nunique()), 总用户数=('user_id', 'nunique') ) stats['观看占比'] = stats['观看用户数'] / stats['总用户数']
针对原代码的直接修正
如果想沿用类似原代码的写法,确保两个统计结果的索引完全一致:
# 按story_id分组计算观看数 watch_counts = df.status.eq(3).astype(int).groupby(df.story_id).sum() # 用groupby.size()替代value_counts(),保证索引顺序一致 total_counts = df.groupby(df.story_id).size() # 生成结果DataFrame result = pd.DataFrame({'观看占比': watch_counts / total_counts})
重要提醒
- 尽量在同一个
groupby操作内完成关联统计,从根源避免索引不匹配的问题。 - 明确你的“总用户数”是记录数还是唯一用户数,这会直接影响占比计算的准确性。
内容的提问来源于stack exchange,提问作者Sophie Martusewicz
相关产品推荐
相关产品推荐

