我想在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)
创建数据框后,我想在数据框中添加一个额外的列。此列包含基于每个名称的coverage列中的值的等级。
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循环的情况下执行此操作吗?
答案 0 :(得分:1)
您可以Series
使用df
,其尺寸与原始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
相同,然后除以transform
:
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
div
的另一个解决方案:
{{1}}