我正在尝试根据“性别”列中的值对 Pandas 数据框中的值进行聚合和求和。这是我正在处理的数据集示例:
df_genders = pd.DataFrame({'Country': ['US','US','US','US','US','India','India','India','UK','UK','UK','UK'],
'Gender': ['Man','Woman', 'Non-Binary,Genderqueer', 'Non-Binary', 'Non-Binary,Genderqueer,Non-Conforming',
'Man','Woman','Non-Binary','Man','Woman', 'Non-Binary,Genderqueer', 'Non-Binary,Genderqueer,Non-Conforming'],
'Count': [7996,915,11,34,153,3857,287,47,2566,272,72,99]})
df_genders
由于 Gender 的值不是很一致,我想将它们组合在一起并总结它们的计数,以获得每个国家的男性、女性和非二进制(非二进制或“男人”)的总和也不是“女人”)。 我无法编写用于条件分组和求和的代码,因此我的方法是找出每个国家/地区的总数,然后从总数中减去男人 + 女人的总和,从而留下非二进制的总和:
df_genders.groupby('Country')['Count'].sum() - df_genders[(df_genders['Gender']=='Man') | (df_genders['Gender']=='Woman')].groupby('Country')['Count'].sum()
您是否知道一种更好的方法来解决这个问题,或者一般来说是一种执行条件聚合(group by 和 sum)的方法吗?
谢谢!
答案 0 :(得分:0)
你可以直接做:
res = df_genders[~df_genders['Gender'].isin(('Man', 'Woman'))]['Count'].sum()
print(res)
输出
416
但我认为如果您使用您正在寻找的分类创建一个新列会更好,例如,一种方法:
df_genders['grouped-genders'] = df_genders['Gender'].map({ 'Man' : 'Man', 'Woman' : 'Woman' }).fillna('Non-Binary')
print(df_genders)
输出
Country Gender Count grouped-genders
0 US Man 7996 Man
1 US Woman 915 Woman
2 US Non-Binary,Genderqueer 11 Non-Binary
3 US Non-Binary 34 Non-Binary
4 US Non-Binary,Genderqueer,Non-Conforming 153 Non-Binary
5 India Man 3857 Man
6 India Woman 287 Woman
7 India Non-Binary 47 Non-Binary
8 UK Man 2566 Man
9 UK Woman 272 Woman
10 UK Non-Binary,Genderqueer 72 Non-Binary
11 UK Non-Binary,Genderqueer,Non-Conforming 99 Non-Binary
然后按新列分组以获取所有性别的计数:
res = df_genders.groupby('grouped-genders')['Count'].sum().reset_index()
print(res)
输出
grouped-genders Count
0 Man 14419
1 Non-Binary 416
2 Woman 1474