如何用Pandas按ID分组将列转换为计数统计?
Pandas按ID分组统计多类别计数实现方案
原始数据
假设你的初始DataFrame如下:
import pandas as pd df = pd.DataFrame({ 'ID': ['aaa', 'aaa', 'aaa', 'bbb', 'bbb', 'ccc'], 'sex': ['M', 'M', 'F', 'F', 'M', 'F'], 'est': ['S', 'C', 'D', 'D', 'C', 'C'] })
对应的表格形式:
| |ID |sex|est|
| 0 |aaa| M | S |
| 1 |aaa| M | C |
| 2 |aaa| F | D |
| 3 |bbb| F | D |
| 4 |bbb| M | C |
| 5 |ccc| F | C |
目标结果
需要得到按ID分组,统计sex(M、F)和est(S、C、D)各类别的计数:
| |ID | M | F | S | C | D |
| 0 |aaa| 2 | 1 | 1 | 1 | 1 |
| 1 |bbb| 1 | 1 | 0 | 1 | 1 |
| 2 |ccc| 0 | 1 | 0 | 1 | 0 |
实现方法
方法一:分表统计后合并(直观清晰)
通过两次pivot_table分别统计sex和est的分组计数,再合并结果:
# 统计每个ID下各sex的数量 sex_counts = df.pivot_table(index='ID', columns='sex', aggfunc='size', fill_value=0) # 统计每个ID下各est的数量 est_counts = df.pivot_table(index='ID', columns='est', aggfunc='size', fill_value=0) # 合并两个统计结果,重置索引 result = pd.concat([sex_counts, est_counts], axis=1).reset_index() # 调整列顺序匹配目标格式(可选) result = result[['ID', 'M', 'F', 'S', 'C', 'D']]
方法二:哑变量转码后分组求和(高效简洁)
利用get_dummies将类别列转为0-1哑变量,再按ID分组求和,适合大数据量场景:
# 对sex和est列生成哑变量,自动拆分多类别 dummy_df = pd.get_dummies(df, columns=['sex', 'est']) # 按ID分组求和,得到各类别计数 result = dummy_df.groupby('ID').sum().reset_index() # 移除列名前缀(可选,让列名更简洁) result.columns = [col.replace('sex_', '').replace('est_', '') for col in result.columns] # 调整列顺序匹配目标格式 result = result[['ID', 'M', 'F', 'S', 'C', 'D']]
两种方法都能高效处理大数据量,不需要手动操作,最终输出结果与目标一致。
内容的提问来源于stack exchange,提问作者Natasha Sakai
相关产品推荐
相关产品推荐

