将具有规范化排名的列添加到pandas数据帧

时间:2017-08-18 09:42:20

标签: python-3.x pandas dataframe normalization

我想在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循环的情况下执行此操作吗?

1 个答案:

答案 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}}