条件总和熊猫数据框

时间:2020-12-28 15:15:55

标签: pandas dataframe

我正在尝试根据“性别”列中的值对 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)的方法吗?

谢谢!

1 个答案:

答案 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