2017-08-18 4 views
1

パンダのデータフレームに正規化されたランキングを持つ列を追加したいとします。手順は次のとおりです。パンダのデータフレームに正規化されたランキングの列を追加する

最初にpandasパッケージをインポートします。

#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) 

データフレームの作成後、データフレームに追加の列を追加します。この列には、各名前のカバレッジ列の値に基づいたランクが別々に含まれています。

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

あなたは、元のdfと同じサイズでSeriesためtransformを使用することができ、その後、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 
関連する問題