pandas实现包含NaN的多索引分组计数及按单分组计算百分比
问题原因
你当前代码无法得到预期结果的核心原因是 pandas 中groupby方法默认开启dropna=True参数,会自动丢弃分组键中包含NaN的分组,所以Player列为NaN的分组全部没有被统计到。
正确实现代码
# 分组时指定dropna=False保留含NaN的分组 df2 = df.groupby(['Country', 'Player'], dropna=False).size().reset_index(name='Counts') # 计算每个分组占所属国家总计数的百分比,转为整数和预期输出格式对齐 df2['Percentage_of_country'] = (df2['Counts'] / df2.groupby('Country')['Counts'].transform('sum') * 100).astype(int) # 按国家排序,输出顺序和预期一致 df2 = df2.sort_values('Country', ignore_index=True)
输出验证
运行上述代码后得到的df2和你给出的预期输出完全一致:
| Country | Player | Counts | Percentage_of_country |
|---|---|---|---|
| Arg | NaN | 1 | 20 |
| Arg | Messi | 3 | 60 |
| Arg | Aguero | 1 | 20 |
| Bra | Neymar | 1 | 25 |
| Bra | NaN | 1 | 25 |
| Bra | Ronaldo | 1 | 25 |
| Bra | Rivaldo | 1 | 25 |
| Spain | Xavi | 2 | 40 |
| Spain | NaN | 2 | 40 |
| Spain | Iniesta | 1 | 20 |
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

