2017-02-12 4 views
1

Angenommen, ich habe Pandas DataFrame wie folgt. Diese roten Werte in Spalte C und E sind entsprechend die höchsten 10 Zahlen in jeder Spalte.Pandas: Holen Sie sich die höchsten n Zeilen basierend auf mehreren Spalten und sie stimmen überein

enter image description here

Wie kann ich einen Datenrahmen wie diese zu erhalten. Wo gibt es nur die Zeilen zurück, die in beiden Spalten in den höchsten 10 sind? Wenn der Wert in den höchsten 10, aber nicht in beiden ist, wird die Zeile ignoriert.

enter image description here

Im Moment kann ich das mit Looping, wo i Schleife zuerst durch jede Säule getrennt und wenn der Wert in den höchsten 10 wird dann speichere ich den Zeilenindex, und dann i Schleife ein drittes Mal, wo ich Indizes ausschließen, die nicht in beiden sind. Dies ist sehr ineffizient, da ich mit einer Tabelle von über 100000 Zeilen arbeite. Gibt es einen besseren Weg, es zu tun?

+0

Konnten Sie filtern Kopieren/Einfügen Ihrer Daten ohne Bilder hinzufügen? –

Antwort

1

Betrachten Sie das Beispiel Datenrahmen df

np.random.seed([3,1415]) 
rng = np.arange(10) 
df = pd.DataFrame(
    dict(
     A=rng, 
     B=list('abcdefghij'), 
     C=np.random.permutation(rng), 
     D=np.random.permutation(rng) 
    ) 
) 

print(df) 

    A B C D 
0 0 a 9 1 
1 1 b 4 3 
2 2 c 5 5 
3 3 d 1 9 
4 4 e 7 4 
5 5 f 6 6 
6 6 g 8 0 
7 7 h 3 2 
8 8 i 2 7 
9 9 j 0 8 

Verwenden nlargest Listen zu identifizieren. Dann query verwenden dataframe

n = 5 
c_lrgst = df.C.nlargest(n) 
d_lrgst = df.D.nlargest(n) 

df.query('C in @c_lrgst & D in @d_lrgst') 

    A B C D 
2 2 c 5 5 
5 5 f 6 6 
+0

danke piRSquared :) – RaduS

Verwandte Themen