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

按ID列分组并统计各Category分类数量的实现方法

解决方法:将分组后的分类计数转换为宽格式表格

我明白你想要把长格式的分类统计转换成每个ID一行、各分类作为列的宽格式表格,之前的groupby用法没触达正确的操作逻辑,这里给你几个简洁可行的方案:

首先构造示例DataFrame

先还原你的输入数据,方便后续演示:

import pandas as pd

df = pd.DataFrame({
    'ID': [1,1,1,1,2,2,2,2,2,3],
    'Category': ['A','B','A','B','A','C','C','A','D','E']
})

方案1:使用pd.crosstab(最直接)

crosstab专门用来计算列联表,正好匹配你的需求——行是ID,列是Category,值为对应组合的出现次数,最后填充缺失值为0并转换为整数类型即可:

result = pd.crosstab(df['ID'], df['Category']).fillna(0).astype(int)
print(result)

输出结果完全符合你的预期:

Category  A  B  C  D  E
ID                     
1         2  2  0  0  0
2         2  0  2  1  0
3         0  0  0  0  1

方案2:groupby + value_counts + unstack

如果你更习惯用groupby操作,可以先按ID分组后统计每个分类的数量,再用unstack把分类转成列,最后直接填充缺失值:

result = df.groupby('ID')['Category'].value_counts().unstack(fill_value=0)
print(result)

这个方法和方案1效果完全一致,unstack(fill_value=0)可以直接把缺失的分类列填充为0,不用额外调用fillna。

为什么你之前的方法没得到预期结果?

  • df.groupby('ID').count():这个是统计每个ID对应的非空行总数,不会按Category拆分统计;
  • df.groupby('ID')['Category']:这只是得到一个分组后的Series对象,还需要后续的聚合(比如value_counts)和格式转换(unstack)操作才能得到宽格式的计数表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:08:15