2017-06-07 67 views
1

nlargest值我有一個數據幀,看起來像下面的圖片: enter image description here得到的多指標數據幀

這裏UID和ID索引。該數據幀是從單個索引數據幀轉換而來的,因此某些列有重複值。對於每個uidavg_diff的所有值都相同,但不同的uid對於此字段將具有不同的值。我想用不同的uid獲得最大的值。

注意:這是一個巨大的數據框架,所以我正在尋找最優化的方式。

回答

1

我認爲你可以先刪除get_level_valuesduplicatedboolean indexing,~的副本用於反轉布爾掩碼。

然後使用DataFrame.nlargestsort_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])