将具有标准化排名的列添加到 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
我想向 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