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

在Pandas中按索引分组统计各值的出现次数

在Pandas中按用户分组统计活动类型的出现次数

没问题,我来帮你搞定这个需求——按User_ID(不管是列还是索引)分组,统计每种Activity值的出现频次。先从构建和你给出的结构一致的示例数据开始,方便我们一步步演示:

import pandas as pd

# 模拟你提供的数据集
data = {
    'User_ID': ['9fbb7702-5209-46c8-b7c8-2c3d03550b56']*6,
    'Title': [
        'On the Gold', 
        'The Amazing Spider-Man 2', 
        'Pearl Harbor', 
        'Big Top Pee-wee', 
        'The Virginian', 
        'Lies My Mother Told Me'
    ],
    'Activity': [
        'VIEWED_MOVIE', 
        'VIEWED_TVSHOW', 
        'VIEWED_MOVIE', 
        'VIEWED_MOVIE', 
        'VIEWED_MOVIE', 
        'VIEWED_MOVIE'
    ]
}

df = pd.DataFrame(data)

方法1:最直观的groupby + value_counts(推荐)

这是处理这类分组统计最常用的方式,逻辑清晰,灵活性强:

# 按User_ID分组,统计每组内Activity各值的出现次数
grouped_counts = df.groupby('User_ID')['Activity'].value_counts()

# 如果想把结果转成宽表(每类活动作为一列),加上unstack并填充空值为0
grouped_counts_wide = df.groupby('User_ID')['Activity'].value_counts().unstack(fill_value=0)

运行grouped_counts会得到多级索引的结果:

User_ID                              Activity      
9fbb7702-5209-46c8-b7c8-2c3d03550b56  VIEWED_MOVIE     5
                                      VIEWED_TVSHOW    1
Name: count, dtype: int64

而grouped_counts_wide会输出更易读的宽表格式:

Activity                     VIEWED_MOVIE  VIEWED_TVSHOW
User_ID
9fbb7702-5209-46c8-b7c8-2c3d03550b56          5              1

方法2:用crosstab快速生成交叉表

如果你只需要最终的宽表结果,pd.crosstab是更简洁的选择:

cross_tab = pd.crosstab(df['User_ID'], df['Activity'])

这个结果和上面的grouped_counts_wide完全一致。

特殊情况:如果User_ID是DataFrame的索引

如果你的数据集里User_ID已经被设置为索引(而不是普通列),只需要调整分组的方式即可:

# 先把User_ID设为索引(模拟你的场景)
df_with_index = df.set_index('User_ID')

# 按索引分组统计
index_grouped_counts = df_with_index.groupby(level=0)['Activity'].value_counts().unstack(fill_value=0)

这样就能完美实现按索引分组统计的需求啦。

内容的提问来源于stack exchange,提问作者Sarang Manjrekar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:45:24