Die meisten Operationen in pandas
kann mit Operator Verkettung erreicht werden ( groupby
, aggregate
, apply
, usw.), aber der einzige Weg , ich Filterreihen gefunden habe , ist über normale Klammer Indizierung
df_filtered = df[df['column'] == value]
Dies ist unattraktiv, da ich df
eine Variable zuweisen muss , bevor ich nach ihren Werten filtern kann. Gibt es so etwas wie das Folgende?
df_filtered = df.mask(lambda x: x['column'] == value)
df.query
undpd.eval
scheinen gut für diesen Anwendungsfall zu passen. Informationen zurpd.eval()
Funktionsfamilie, ihren Funktionen und Anwendungsfällen finden Sie unter Auswertung dynamischer Ausdrücke in Pandas mit pd.eval () .Antworten:
Ich bin mir nicht ganz sicher, was Sie wollen, und Ihre letzte Codezeile hilft auch nicht, aber trotzdem:
Die "verkettete" Filterung erfolgt durch "Verketten" der Kriterien im Booleschen Index.
Wenn Sie Methoden verketten möchten, können Sie Ihre eigene Maskenmethode hinzufügen und diese verwenden.
quelle
(df.A == 1) & (df.D == 6)
das "&" ein überladener Operator in Pandas?pandas.
. Du solltestimport pandas as pd
.import pandas as pd
ist es heute üblich. Ich bezweifle, dass ich die Frage beantwortet habe.Filter können mithilfe einer Pandas- Abfrage verkettet werden :
Filter können auch in einer einzigen Abfrage kombiniert werden:
quelle
df.query('a in list([1,2])')
,s = set([1,2]); df.query('a in @s')
.Die Antwort von @lodagro ist großartig. Ich würde es erweitern, indem ich die Maskenfunktion wie folgt verallgemeinere:
Dann können Sie Dinge tun wie:
quelle
DataFrame
s integriert !Seit Version 0.18.1
.loc
akzeptiert die Methode einen Aufruf zur Auswahl. Zusammen mit Lambda-Funktionen können Sie sehr flexible verkettbare Filter erstellen:Wenn Sie nur filtern, können Sie das auch weglassen
.loc
.quelle
Ich biete dies für weitere Beispiele an. Dies ist die gleiche Antwort wie https://stackoverflow.com/a/28159296/
Ich werde weitere Änderungen hinzufügen, um diesen Beitrag nützlicher zu machen.
pandas.DataFrame.query
query
wurde genau zu diesem Zweck gemacht. Betrachten Sie den Datenrahmendf
Lassen Sie uns
query
alle Zeilen wo filternD > B
Was wir verketten
quelle
Ich hatte die gleiche Frage, außer dass ich die Kriterien zu einer ODER-Bedingung kombinieren wollte. Das von Wouter Overmeire angegebene Format kombiniert die Kriterien zu einer UND-Bedingung, sodass beide erfüllt sein müssen:
Ich habe jedoch festgestellt, dass, wenn Sie jede Bedingung einwickeln
(... == True)
und die Kriterien mit einer Pipe verbinden, die Kriterien in einer ODER-Bedingung kombiniert werden, die erfüllt ist, wenn eine der beiden Bedingungen erfüllt ist:quelle
df[(df.A==1) | (df.D==6)]
ausreichend für das, was Sie erreichen wollen?pandas bietet zwei Alternativen zur Antwort von Wouter Overmeire, für die kein Überschreiben erforderlich ist. Einer ist
.loc[.]
mit einem Callable wie inder andere ist
.pipe()
, wie inquelle
Meine Antwort ist ähnlich wie bei den anderen. Wenn Sie keine neue Funktion erstellen möchten, können Sie das verwenden, was pandas bereits für Sie definiert hat. Verwenden Sie die Rohrmethode.
quelle
a.join(b).pipe(lambda df: df[df.column_to_filter == 'VALUE'])
Wenn Sie alle gängigen Booleschen Masken sowie eine Allzweckmaske anwenden möchten, können Sie Folgendes in eine Datei einfügen und sie dann einfach wie folgt zuweisen:
Verwendungszweck:
Es ist ein bisschen hackig, aber es kann die Dinge ein bisschen sauberer machen, wenn Sie Datensätze kontinuierlich nach Filtern hacken und ändern. Es gibt auch einen Allzweckfilter, der von Daniel Velkov oben in der Funktion gen_mask angepasst wurde und den Sie mit Lambda-Funktionen oder auf andere Weise verwenden können, falls dies gewünscht wird.
Zu speichernde Datei (ich verwende masks.py):
quelle
Diese Lösung ist in Bezug auf die Implementierung hackiger, aber ich finde sie in Bezug auf die Verwendung viel sauberer und sicherlich allgemeiner als die anderen vorgeschlagenen.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Sie müssen nicht das gesamte Repo herunterladen: Speichern der Datei und Ausführen
sollte ausreichen. Dann benutzt du es so:
Ein etwas weniger dummes Anwendungsbeispiel:
Übrigens: Auch wenn Sie nur boolesche Spalten verwenden,
kann viel effizienter sein als
weil es
cond2
nur auswertet , wocond1
istTrue
.HAFTUNGSAUSSCHLUSS: Ich habe diese Antwort zuerst woanders gegeben, weil ich das nicht gesehen hatte.
quelle
Ich möchte nur eine Demonstration mit hinzufügen
loc
der der verkettete Vorgang nicht nur nach Zeilen, sondern auch nach Spalten und einigen Vorzügen gefiltert wird.Der folgende Code kann die Zeilen nach Wert filtern.
Durch ein wenig Ändern können Sie auch die Spalten filtern.
Warum wollen wir also eine verkettete Methode? Die Antwort ist, dass es einfach zu lesen ist, wenn Sie viele Operationen haben. Zum Beispiel,
quelle
scheint zu funktionieren: Sie können den
[]
Operator auch verschachteln . Vielleicht haben sie es hinzugefügt, seit Sie die Frage gestellt haben.quelle
df
jetzt nicht unbedingt auf die Ausgabe des vorherigen Teils der Kette Bezug genommen wird.Wenn Sie Ihre Spalten so einstellen, dass sie als Indizes suchen, können Sie
DataFrame.xs()
einen Querschnitt verwenden. Dies ist nicht so vielseitig wie diequery
Antworten, kann jedoch in einigen Situationen hilfreich sein.quelle
Sie können die Numpy- Bibliothek auch für logische Operationen nutzen. Es ist ziemlich schnell.
quelle