我有一个 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 aggregation
的DataFrameGroupBy.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 功能。
如果您目前无法升级,解决方法是将 Player 列中的 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句