pandas Sortieren Sie lambda-Funktion
Gegeben ein dataframe 'a' mit 3 Spalten, A , B , C und 3 Reihen mit numerischen Werten. Wie macht man Sortiere alle Zeilen mit einem comp-Betreiber mit nur das Produkt von A[i]*B[i]. Es scheint, dass die pandas Sortieren dauert nur Spalten und dann ein sort-Methode.
Ich möchte eine Vergleich-Funktion wie unten beschrieben.
f = lambda i,j: a['A'][i]*a['B'][i] < a['A'][j]*a['B'][j]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mindestens zwei Möglichkeiten:
Methode 1
Sagen, Sie beginnen mit
Können Sie eine Spalte hinzufügen, die Ihrer Art Schlüssel
Schließlich Sortieren, indem Sie es und legen Sie es
Methode 2
Verwenden
numpy.argsort
und verwenden Sie dann.ix
auf die daraus resultierenden Indizes:df.assign(sortval = df.A * df.B).sort_values('sortval').drop('sortval', 1)
.Einen anderen Weg, indem es hier, weil das ist das erste Ergebnis bei Google:
Dies funktioniert gut für mich und ist ziemlich einfach. @Ami Tavory Antwort gab seltsame Ergebnisse bei mir mit einer kategorischen index; nicht sicher, es ist, weil, dass, obwohl.
df.**iloc**[(df.A * df.B).sort_values().index]
wenn Ihr index, wenn die position-based (vs-label-based)Nur das hinzufügen von @srs super elegante Antwort ein
iloc
option mit einige Zeit Vergleiche mitloc
und die naive Lösung.(iloc ist bevorzugt, wenn Ihr Ihrer index-position-based (vs-label-Basis für loc)
naiv: 100 loops, best of 3: 1.85 ms pro Schleife
loc: 100 loops, best of 3: 2.69 ms pro Schleife
iloc: 100 loops, best of 3: 2.02 ms pro Schleife
Test-Ergebnisse (Vergleich der gesamten index-Reihenfolge) zwischen allen Optionen:
Wahr
Wahr