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

如何用Pandas按id分组并统计各分组中gender的m、f数量?

解决按ID分组统计性别数量的问题

首先先回顾下你的原始数据生成代码:

import pandas
df = pandas.DataFrame()
df['id'] = list('aaabbbcccdddeee')
df['gender'] = list('mmfmfmmffmfmfff')

生成的DataFrame是:

id gender
0 a m
1 a m
2 a f
3 b m
4 b f
5 b m
6 c m
7 c f
8 c f
9 d m
10 d f
11 d m
12 e f
13 e f
14 e f

想要得到按id分组,统计每个id下m和f的数量,这里有两种简单高效的方法:

方法一:使用groupby + value_counts + unstack

这是最直观的分组统计方式,步骤清晰:

import pandas as pd

# 生成原始数据
df = pd.DataFrame()
df['id'] = list('aaabbbcccdddeee')
df['gender'] = list('mmfmfmmffmfmfff')

# 分组统计并转换格式
result = df.groupby('id')['gender'].value_counts().unstack(fill_value=0)
# 调整列顺序为m在前、f在后,确保和目标格式一致
result = result[['m', 'f']]
print(result)

运行后输出就是你想要的:

m  f
a  2  1
b  2  1
c  1  2
d  2  1
e  0  3

代码解释:

  • groupby('id'):按照id列对DataFrame进行分组
  • ['gender'].value_counts():统计每个分组内gender列中各值的出现次数
  • unstack(fill_value=0):把原本作为行索引的gender值转换为列,同时把缺失的数值(比如e分组里没有m)填充为0
  • 最后通过[['m', 'f']]指定列的顺序,保证输出和预期一致

方法二:使用pivot_table(透视表)

如果你习惯用透视表的思路,这个方法更简洁:

import pandas as pd

df = pd.DataFrame()
df['id'] = list('aaabbbcccdddeee')
df['gender'] = list('mmfmfmmffmfmfff')

result = pd.pivot_table(df, index='id', columns='gender', aggfunc='size', fill_value=0)[['m', 'f']]
print(result)

代码解释:

  • pivot_table:Pandas的透视表函数,专门用于分组聚合统计
  • index='id':指定行索引为id
  • columns='gender':指定列名为gender的不同取值
  • aggfunc='size':统计每个分组的行数(也就是各性别的数量)
  • fill_value=0:填充缺失值为0
  • 同样通过[['m', 'f']]调整列顺序

两种方法都能完美得到你需要的结果,选哪个看你个人习惯啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:36:29