2017-06-07 5 views
1

ich einen Datenrahmen, die wie folgendes Bild aussieht: enter image description herenlargest Werte von Multi-Index-Datenrahmen erhalten

Hier uid und id sind Indizes. Dieser Datenrahmen wurde aus einem einzelnen Indexdatenrahmen konvertiert, sodass für einige Spalten doppelte Werte vorhanden sind. Für jede UID sind alle Werte für avg_diff gleich, aber unterschiedliche UID werden unterschiedliche Werte für dieses Feld haben. Ich möchte die größten 10 avg_diff Werte mit verschiedenen Uids erhalten.

Hinweis: Dies ist ein riesiger Datenrahmen, so suche ich nach dem optimierten Weg.

Antwort

1

Ich denke, Sie können zuerst entfernen Duplikate von get_level_values und duplicated mit boolean indexing, ~ ist für invertierte boolean Maske.

verwenden Dann DataFrame.nlargest oder 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 

Eine andere Lösung:

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

Verwenden 'print (df [~ Maske] .nsmallest (2, 'avg_diff'))' – jezrael

+0

Oder 'df [~ mask] .sort_values ​​('avg_diff'). Kopf (2)' – jezrael

0

Wenn ich Sie richtig verstanden, Sie müssen nur Duplikate von „uid fallen "und sortieren Sie dann nach avr_diff

unique_uid = data.reset_index().drop_duplicates("uid").set_index("uid") 
print(unique_uid["avr_diff"].sort_values(ascending=False)[:10])