Ich werde die generische Lösung von @ User erweitern, um eine drop
kostenlose Alternative bereitzustellen . Dies ist für Leute, die hier basierend auf dem Titel der Frage gerichtet sind (nicht das Problem von OP).
Angenommen, Sie möchten alle Zeilen mit negativen Werten löschen. Eine Linerlösung ist: -
df = df[(df > 0).all(axis=1)]
Schritt für Schritt Erklärung: -
Lassen Sie uns einen 5x5 zufälligen Normalverteilungsdatenrahmen erzeugen
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
Lassen Sie die Bedingung Negative löschen. Ein boolescher 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
Filtern Sie schließlich Zeilen aus dem Datenrahmen basierend auf der Bedingung heraus
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 zurück zu df zuweisen , um tatsächlich löschen vs Filter über ing getan
df = df[(df > 0).all(axis=1)]
Dies kann leicht erweitert werden, um Zeilen herauszufiltern, die NaNs enthalten (nicht numerische Einträge): -
df = df[(~df.isnull()).all(axis=1)]
Dies kann auch für folgende Fälle vereinfacht werden: Löschen Sie alle Zeilen, in denen Spalte E negativ ist
df = df[(df.E>0)]
Ich möchte mit einigen Profilstatistiken enden, warum die @ User- drop
Lösung langsamer ist als die rohe spaltenbasierte Filterung: -
%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 Säule ist im Grunde ein Series
dh ein NumPy
Array, kann es ohne Kosten indexiert werden. Für Leute, die daran interessiert sind, wie sich die zugrunde liegende Speicherorganisation auf die Ausführungsgeschwindigkeit auswirkt, gibt es hier einen großartigen Link zur Beschleunigung von Pandas :
df[[(len(x) < 2) for x in df['column name']]]
aber deines ist viel schöner. Danke für Ihre Hilfe!