2017-08-18 1 views
1

Je voudrais ajouter une colonne avec des classements normalisés à une base de données pandas. Le processus est le suivant:Ajouter des colonnes avec des classements normalisés à une base de données pandas

Importez d'abord le paquet pandas.

#import packages 
import pandas as pd 

Définir une trame de données pandas. Une fois la structure de données créée, je souhaite ajouter une colonne supplémentaire à l'image de données. Cette colonne contient le classement basé sur les valeurs de la colonne de couverture pour chaque nom séparément.

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 

Je veux maintenant normaliser les valeurs dans la colonne de classement.

La sortie souhaitée est

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 

Quelqu'un connait un moyen de le faire sans utiliser explicitement en boucle?

Répondre

1

Vous pouvez utiliser transform pour Series avec la même taille que l'original df puis diviser par 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 

Une autre solution avec 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