如何用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':指定行索引为idcolumns='gender':指定列名为gender的不同取值aggfunc='size':统计每个分组的行数(也就是各性别的数量)fill_value=0:填充缺失值为0- 同样通过
[['m', 'f']]调整列顺序
两种方法都能完美得到你需要的结果,选哪个看你个人习惯啦~
内容的提问来源于stack exchange,提问作者user1367204
相关产品推荐
相关产品推荐

