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

丹麦语

我有一个 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 功能。

如果您目前无法升级,解决方法是将 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

python groupby多列,计数和百分比

如何计算groupby /数据透视表中特定响应的百分比?

Python Pandas Groupby的总和和百分比

如何在Python中的groupby中计算计数和百分比

如何在Pandas中的groupby之后获取列计数的百分比

pandas groupby:如何计算总数百分比?

熊猫groupby将非空值计数为百分比

使用pyspark计算groupBy总数的百分比

在多索引Groupby对象中填充Nan值

如何绘制groupby在seaborn中的百分比?

熊猫groupby并计算百分比变化

获取基于Pandas中groupby的百分比?

列中的False百分比,groupby

Python:结合groupby计算MultiIndex DataFrame中每列的百分比变化

如何计算Pyspark中的None或NaN值的百分比?

如何使用Pandas Groupby计算每列中总计的百分比

熊猫groupby和列中每个值的出现百分比

如何使用groupby计算熊猫数据框中特定列的总数百分比?

如何计算groupby列的百分比并按降序排序?

如何计算多级索引groupby的百分比?

熊猫的groupby统计数据中的NaN值

在 Grafana 中与 groupBy 一起计算百分比

Pandas Groupby - 计算每组总价值的百分比

根据另一列计算 groupby 中的百分比

另一列非 NaN 的 Groupby 计数和 Pandas 中相同列的具体计算

在多索引数据框中减去值并计算百分比

使用 bigquery 中的 groupby 函数计算 COUNT 的百分比

如何获取groupby总数然后计算Pandas DataFrame列的百分比

Pandas GroupBy :布尔标志的百分比为真