You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:36:00