2017-09-26 9 views
1

をパンダ:GROUPBYつの列とトップN iはDFを有する

main_id b_code Scores 
    1   ABC  0.56 
    1   ABC  0.21 
    1   BCD  0.7 
    1   QWE  0.3 
    1   ZXC  0.8 
    2   ABC  0.26 
    2   ABC  0.81 
    2   BCD  0.24 
    2   QWE  0.87 
    2   ZXC  0.43 

Iは、それらのスコアに応じて、各main_idためトップ2 b_codeを見つけなければなりません。

私の最終的な結果は次のようになります。

main_id b_code Scores 
1   ZXC  0.8 
1   ABC  0.56 
2   QWE  0.87 
2   ABC  0.81 

私はGROUPBYとnlargestで実行しようとしましたが、結果は間違っていました。

+1

Congratを – jezrael

+0

@jezraelを:) 1Kします:ありがとう!しかし、私にとってあなたは神様です:) – Shubham

答えて

2

あなたはsort_values + groupby + GroupBy.head使用することができます。

df = df.sort_values(['main_id','Scores'], ascending=[True,False]).groupby('main_id').head(2) 
print (df) 
    main_id b_code Scores 
4  1 ZXC 0.80 
2  1 BCD 0.70 
8  2 QWE 0.87 
6  2 ABC 0.81 

またはすべての列のset_indexmain_idなしとScores + groupby + nlargest + reset_index

df = df.set_index('b_code').groupby('main_id')['Scores'].nlargest(2).reset_index() 
print (df) 
    main_id b_code Scores 
0  1 ZXC 0.80 
1  1 BCD 0.70 
2  2 QWE 0.87 
3  2 ABC 0.81 
関連する問題