如何在Python的Pandas中统计分类列各值按ID分组的出现次数?
Pandas分组统计CAT值次数并重塑列格式
原始数据
ID CAT 1 A 1 B 1 A 2 A 2 B 2 A 1 B 1 A
需求目标
按ID分组,将CAT列中A、B的出现次数分别转为CAT_A_NUM、CAT_B_NUM列,最终输出如下格式:
ID CAT_A_NUM CAT_B_NUM 1 3 2 2 2 1
你的尝试与优化方案
你用pivot_table的思路是正确的,只是缺少列名调整和索引重置步骤,导致格式不符合预期。以下是两种可行的解决方法:
方法1:优化pivot_table实现
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ID': [1,1,1,2,2,2,1,1], 'CAT': ['A','B','A','A','B','A','B','A'] }) # 分组统计次数,fill_value=0确保空值显示为0 pivot_result = df.pivot_table(index='ID', columns='CAT', aggfunc='size', fill_value=0) # 重命名列名,匹配需求格式 pivot_result.columns = [f'CAT_{col}_NUM' for col in pivot_result.columns] # 重置索引,让ID从索引转为普通列 final_result = pivot_result.reset_index() print(final_result)
输出结果:
ID CAT_A_NUM CAT_B_NUM 0 1 3 2 1 2 2 1
方法2:使用crosstab(更简洁)
pd.crosstab专门用于计算分组频数,用这个方法可以快速完成统计,再调整列名即可:
crosstab_result = pd.crosstab(df['ID'], df['CAT']) crosstab_result.columns = [f'CAT_{col}_NUM' for col in crosstab_result.columns] final_result = crosstab_result.reset_index() print(final_result)
输出结果和方法1完全一致。
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

