私はあなたが最初~
が反転ブールマスク用で、boolean indexing
でget_level_values
とduplicated
で重複を削除することができると思います。
その後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
使用 'プリント(DF [〜マスク] .nsmallest(2 'avg_diff'))' – jezrael
や 'DF [〜マスク] .sort_values( 'avg_diff')。ヘッド(2)' – jezrael