Ich werde die generische Lösung von @User erweitern, um eine drop
kostenlose Alternative. Dies ist für Leute, die aufgrund des Titels der Frage hierher geleitet werden (nicht das Problem des Auftraggebers)
Angenommen, Sie möchten alle Zeilen mit negativen Werten löschen. Eine einfache Lösung ist:-
df = df[(df > 0).all(axis=1)]
Schritt-für-Schritt-Erläuterung:--
Erzeugen wir einen 5x5-Zufallsdatenrahmen mit Normalverteilung
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE'))
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
1 -0.977278 0.950088 -0.151357 -0.103219 0.410599
2 0.144044 1.454274 0.761038 0.121675 0.443863
3 0.333674 1.494079 -0.205158 0.313068 -0.854096
4 -2.552990 0.653619 0.864436 -0.742165 2.269755
Die Bedingung sei das Löschen von Negativen. Ein boolescher Wert df, der die Bedingung erfüllt:-
df > 0
A B C D E
0 True True True True True
1 False True False False True
2 True True True True True
3 True True False True False
4 False True True False True
Eine boolesche Reihe für alle Zeilen, die die Bedingung erfüllen Hinweis: Wenn ein Element in der Zeile die Bedingung nicht erfüllt, wird die Zeile als falsch markiert.
(df > 0).all(axis=1)
0 True
1 False
2 True
3 False
4 False
dtype: bool
Schließlich filtern Sie die Zeilen aus dem Datenrahmen auf der Grundlage der Bedingung
df[(df > 0).all(axis=1)]
A B C D E
0 1.764052 0.400157 0.978738 2.240893 1.867558
2 0.144044 1.454274 0.761038 0.121675 0.443863
Sie können es wieder df zuweisen, um tatsächlich löschen gegen Filter ing oben getan
df = df[(df > 0).all(axis=1)]
Dies kann leicht erweitert werden, um Zeilen herauszufiltern, die NaN s (nicht numerische Einträge) enthalten:-
df = df[(~df.isnull()).all(axis=1)]
Dies kann auch für Fälle wie diesen vereinfacht werden: Alle Zeilen löschen, in denen die Spalte E negativ ist
df = df[(df.E>0)]
Zum Schluss möchte ich noch einige Statistiken darüber anführen, warum @User's drop
Lösung ist langsamer als die Rohsäulenfiltration:-
%timeit df_new = df[(df.E>0)]
345 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit dft.drop(dft[dft.E < 0].index, inplace=True)
890 µs ± 94.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Eine Spalte ist im Grunde eine Series
d.h. eine NumPy
Array, kann es ohne Kosten indiziert werden. Für Leute, die daran interessiert sind, wie sich die zugrunde liegende Speicherorganisation auf die Ausführungsgeschwindigkeit auswirkt, gibt es hier eine großartige Link zur Beschleunigung von Pandas :