gpt4 book ai didi

python - 多索引 groupby 计数,包括 pandas 中的 NaN 值,并通过单个 groupby 计算百分比

转载 作者:行者123 更新时间:2023-12-04 13:06:40 25 4
gpt4 key购买 nike

我有一个 df,如下所示。

df:

Country       Player
Arg Messi
Bra Neymar
Arg NaN
Arg Messi
Arg Aguero
Arg Messi
Bra Ronaldo
Spain Xavi
Spain NaN
Spain NaN
Bra Rivaldo
Spain Iniesta
Bra NaN
Spain Xavi

其中 NaN 代表信息不可用。从上面的 df,我想执行多个 groupby 计数,如下所示。

预期输出:

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 NaN 2 40
Spain Xavi 2 40
Spain Iniesta 1 20

我试过下面的代码:

df2 = df.groupby(['Country', 'Player']).size().reset_index(name='counts')
df2['prcntg'] = df2['counts']/df2.groupby('Country')['counts'].transform('sum')
df2

最佳答案

另一种方法,真正在单个 groupby 中产生所有结果如下:

定义一个辅助函数来计算百分比:

使用 dropna=False 来保持 NaN 值:

f = lambda x: x.size / df.groupby('Country', dropna=False).size()[x.iloc[0]] * 100

第一个size函数返回['Country', 'Player']组下的计数,而第二个size函数,仅在 Country 下分组,返回较大组下的计数。

然后,利用 named aggregationDataFrameGroupBy.aggregate() :

(df.groupby(['Country', 'Player'], dropna=False)
.agg(counts=('Player', 'size'),
prcntg=('Country', f))
)

结果:

                 counts  prcntg
Country Player
Arg Aguero 1 20.0
Messi 3 60.0
NaN 1 20.0
Bra Neymar 1 25.0
Rivaldo 1 25.0
Ronaldo 1 25.0
NaN 1 25.0
Spain Iniesta 1 20.0
Xavi 2 40.0
NaN 2 40.0

编辑

如果您遇到错误 TypeError: groupby() got an unexpected keyword argument 'dropna',可能您的 Pandas 版本早于版本 1.1.0。此版本支持此 dropna 参数,它允许您保留 NaN 计数。您可能应该考虑升级您的 Pandas 以获得更丰富的 Pandas 功能。

如果您目前无法升级,解决方法是将播放器列中的 NaN 替换为其他文本,例如。分组前的字符串 '_NaN' 或一些特殊单词。如果需要,您可以在分组后恢复其值。示例代码如下:

import numpy as np

df['Player'] = df['Player'].fillna('_NaN') # Set `NaN` values to string `_NaN`

# Main processing with all results produced in a single `groupby`:
f = lambda x: x.size / df.groupby('Country').size()[x.iloc[0]] * 100
df_out = (df.groupby(['Country', 'Player'], as_index=False)
.agg(counts=('Player', 'size'),
prcntg=('Country', f))
)

df_out['Player'] = df_out['Player'].replace('_NaN', np.nan) # restore `NaN` values

结果:

print(df_out)

Country Player counts prcntg
0 Arg Aguero 1 20.0
1 Arg Messi 3 60.0
2 Arg NaN 1 20.0
3 Bra Neymar 1 25.0
4 Bra Rivaldo 1 25.0
5 Bra Ronaldo 1 25.0
6 Bra NaN 1 25.0
7 Spain Iniesta 1 20.0
8 Spain Xavi 2 40.0
9 Spain NaN 2 40.0

关于python - 多索引 groupby 计数,包括 pandas 中的 NaN 值,并通过单个 groupby 计算百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69063250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com