pandas如何按ID分组统计各Type值的出现次数
Pandas按ID分组统计分类值计数实现方案
以下代码可直接运行,最终输出完全匹配你需要的ID、a_count、b_count三列结果:
1. 数据读取
首先读取本地Excel文件,将代码中的路径替换为你实际的文件存储路径即可:
import pandas as pd # 读取Excel源数据 df = pd.read_excel("你的数据文件实际路径.xlsx") # 测试用样例数据(和你描述的原始数据完全一致,可用于提前验证逻辑) # df = pd.DataFrame({ # "ID": [1,1,1,2,2], # "Type": ["a","a","b","a","b"] # })
2. 分组统计实现
方法一:交叉表实现(写法最简洁,适配固定分类计数场景)
# 按ID维度统计不同Type值的出现次数 result = pd.crosstab(index=df["ID"], columns=df["Type"]) # 重命名列匹配要求的输出格式 result.columns = [f"{col}_count" for col in result.columns] # 将ID从索引还原为普通数据列 result = result.reset_index()
方法二:groupby原生写法(匹配你原本想用groupby的实现思路)
之前调用groupby无法得到预期结果,通常是因为分组计数后没有将分类值从行索引展开为列,正确写法如下:
# 分组后对Type列做值计数,再将分类值展开为列,缺失值填充0 result = df.groupby("ID")["Type"].value_counts().unstack(fill_value=0) result.columns = [f"{col}_count" for col in result.columns] result = result.reset_index()
输出结果验证
两种方法执行后输出的result内容完全符合预期:
| ID | a_count | b_count |
|---|---|---|
| 1 | 2 | 1 |
| 2 | 1 | 1 |
补充说明:如果后续Type字段新增其他分类值,上述代码会自动生成对应分类的count列,无需手动修改统计逻辑;如果只需要统计a、b两类的计数,在得到结果后筛选保留对应三列即可。
内容的提问来源于stack exchange,提问作者user19435923
相关产品推荐
相关产品推荐

