将具有标准化排名的列添加到 pandas 数据框

Add columns with normalised rankings to a pandas dataframe

我想向 pandas 数据框添加一个具有标准化排名的列。过程如下:

首先导入 pandas 包。

#import packages
import pandas as pd

定义一个 pandas 数据框。

# Create dataframe
data = {'name': ['Jason', 'Jason', 'Tina', 'Tina', 'Tina'],
        'reports': [4, 24, 31, 2, 3],
        'coverage': [25, 94, 57, 62, 70]}
df = pd.DataFrame(data)

创建数据框后,我想向数据框添加一个额外的列。此列包含基于每个名称的覆盖率列中的值的排名。

df['coverageRank'] = df.groupby('name')['coverage'].rank()
print (df)
   coverage   name  reports  coverageRank
0        25  Jason        4           1.0
1        94  Jason       24           2.0
2        57   Tina       31           1.0
3        62   Tina        2           2.0
4        70   Tina        3           3.0

我现在想规范化排名列中的值。

期望的输出是

   coverage   name  reports  coverageRank
0        25  Jason        4      0.500000
1        94  Jason       24      1.000000
2        57   Tina       31      0.333333
3        62   Tina        2      0.666667
4        70   Tina        3      1.000000

有人知道不使用显式 for 循环的方法吗?

您可以使用 transform for Series with same size as original df and then divide by div:

a = df.groupby('name')['coverage'].transform('size')
print (a)
0    2
1    2
2    3
3    3
4    3
Name: coverage, dtype: int64

df['coverageRank'] = df.groupby('name')['coverage'].rank().div(a)
print (df)
   coverage   name  reports  coverageRank
0        25  Jason        4      0.500000
1        94  Jason       24      1.000000
2        57   Tina       31      0.333333
3        62   Tina        2      0.666667
4        70   Tina        3      1.000000

apply的另一个解决方案:

df['coverageRank'] = df.groupby('name')['coverage'].apply(lambda x: x.rank() / len(x))
print (df)
   coverage   name  reports  coverageRank
0        25  Jason        4      0.500000
1        94  Jason       24      1.000000
2        57   Tina       31      0.333333
3        62   Tina        2      0.666667
4        70   Tina        3      1.000000