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
from where import where as W
sollte ausreichen. Dann benutzt du es so:
df = pd.DataFrame([[1, 2, True],
[3, 4, False],
[5, 7, True]],
index=range(3), columns=['a', 'b', 'c'])
# On specific column:
print(df.loc[W['a'] > 2])
print(df.loc[-W['a'] == W['b']])
print(df.loc[~W['c']])
# On entire - or subset of a - DataFrame:
print(df.loc[W.sum(axis=1) > 3])
print(df.loc[W[['a', 'b']].diff(axis=1)['b'] > 1])
Ein etwas weniger dummes Anwendungsbeispiel:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
Übrigens: Auch wenn Sie nur boolesche Spalten verwenden,
df.loc[W['cond1']].loc[W['cond2']]
kann viel effizienter sein als
df.loc[W['cond1'] & W['cond2']]
weil es cond2
nur auswertet , wo cond1
ist True
.
HAFTUNGSAUSSCHLUSS: Ich habe diese Antwort zuerst woanders gegeben, weil ich das nicht gesehen hatte.
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 () .