2017-06-07 4 views
1

私は以下の画像のように見えるデータフレームを持っています: enter image description hereマルチインデックスデータフレームからnlargest値

ここでuidとIDがインデックスされています。このデータフレームは単一のインデックスデータフレームから変換されたため、一部の列には値が重複しています。 のuidの場合、avg_diffのすべての値は同じですが、異なるuidはこのフィールドに異なる値を持ちます。私は最大値を取得したい0 avg_diffの値は、異なるuidを使用します。

注::これは巨大なデータフレームなので、私は最も最適化された方法を探しています。

答えて

1

私はあなたが最初~が反転ブールマスク用で、boolean indexingget_level_valuesduplicatedで重複を削除することができると思います。

その後DataFrame.nlargestまたはsort_values + headを使用します。

df = pd.DataFrame({'uid':[1,1,1,2,2,3,3], 'id':[2,3,4,5,6,1,3], 
        'avg_diff':[0.1,0.1,0.1,0.2,0.2,0.3,0.3]}) 
df = df.set_index('uid').set_index('id', drop=False, append=True) 
print (df) 
     avg_diff id 
uid id    
1 2  0.1 2 
    3  0.1 3 
    4  0.1 4 
2 5  0.2 5 
    6  0.2 6 
3 1  0.3 1 
    3  0.3 3 

mask = df.index.get_level_values('uid').duplicated() 
print (~mask) 
[ True False False True False True False] 

df = df[~mask].nlargest(2, 'avg_diff') 
print (df) 
     avg_diff id 
uid id    
3 1  0.3 1 
2 5  0.2 5 

別の解決策:

mask = df.index.get_level_values('uid').duplicated() 
print (~mask) 
[ True False False True False True False] 

df = df[~mask].sort_values('avg_diff', ascending=False).head(2) 
print (df) 

     avg_diff id 
uid id    
3 1  0.3 1 
2 5  0.2 5 
+0

使用 'プリント(DF [〜マスク] .nsmallest(2 'avg_diff'))' – jezrael

+0

や 'DF [〜マスク] .sort_values( 'avg_diff')。ヘッド(2)' – jezrael

0

私はあなたが右の理解場合は、あなただけのuid「の重複をドロップする必要があります"次にavr_diffで並べ替え

unique_uid = data.reset_index().drop_duplicates("uid").set_index("uid") 
print(unique_uid["avr_diff"].sort_values(ascending=False)[:10]) 
関連する問題