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

