2017-08-18 48 views
1

我想將具有規範化排名的列添加到熊貓數據框中。流程如下:將具有規範化排名的列添加到熊貓數據框中

先導入熊貓包。

#import packages 
import pandas as pd 

定義一個熊貓數據框。

# 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 

是否有人知道的方式來做到這一點,而無需使用顯式的循環?

回答

1

可以使用transformSeries與相同尺寸的原df然後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 
相關問題