在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
相关产品推荐
相关产品推荐

