2017-08-05 1 views
0

だから私はこのようなデータフレームがあります。パンダでは、すべてのサブローを削除しますが、multiIndexデータフレームの特定の列で最高の値を持つサブノートを保持する方法はありますか?

+---+-----+------------+------------+-------+ 
| |  | something1 | something2 | score | 
+---+-----+------------+------------+-------+ 
| 1 | 112 |  1.00 |  10.0 | 15 | 
| | 116 |  0.76 |  -2.00 | 14 | 
| 8 | 112 |  0.76 |  0.05 | 55 | 
| | 116 |  1.00 |  1.02 | 54 | 
+---+-----+------------+------------+-------+ 

をそして私はこれを達成したい:

+---+-----+------------+------------+-------+ 
| |  | something1 | something2 | score | 
+---+-----+------------+------------+-------+ 
| 1 | 112 |  1.00 |  10.0 | 15 | 
| 8 | 112 |  1.00 |  1.02 | 55 | 
+---+-----+------------+------------+-------+ 

が、私は最大のスコア値を持つ各最初のインデックスのために一つだけの行を維持したいです。

私は、各グループの最初の行を選択し、その後DFを並べ替え、このような何かをしようとしたが、期待どおりに動作しませんでした:

df = df.sort_values("score", ascending=False).groupby(level=[0, 1]).first() 

ありがとうございました!

あなたが唯一のレベル0でグループに必要
+0

なぜあなたはindex = 8の2番目の行を保持していますか?スコアが最大であるので、最初の行にすべきではありませんか? – Psidom

+0

あなたは正しいです、私は編集しました –

答えて

2

(df.sort_values("score", ascending=False) 
    .reset_index(level=1) 
    .groupby(level=0).first() 
    .set_index('level_1', append=True)) 

#   something1 something2 score 
# level_1   
#1.0 112  1.00  10.00  15 
#8.0 112  0.76  0.05  55 

df.sort_values("score", ascending=False).groupby(level=0).first() 
#  something1 something2 score 
#1.0  1.00  10.00 15 
#8.0  0.76  0.05 55 

が第2レベルのインデックスを維持するには、列になり、後にインデックスとして戻ってそれを設定し、それをリセットすることができます

nlargestを使用する代替:

df.groupby(level=0, group_keys=False).apply(lambda g: g.nlargest(1, 'score')) 
#  something1 something2 score 
#1.0 112  1.00  10.00  15 
#8.0 112  0.76  0.05  55 
関連する問題