it-swarm.com.de

Wie lösche ich Zeilen aus Pandas-Datenrahmen, die eine bestimmte Zeichenfolge in einer bestimmten Spalte enthalten?

Ich habe einen sehr großen Datenrahmen in Python und möchte alle Zeilen löschen, die eine bestimmte Zeichenfolge in einer bestimmten Spalte enthalten.

Ich möchte zum Beispiel alle Zeilen mit der Zeichenfolge "XYZ" als Teilstring in die Spalte C des Datenrahmens einfügen.

Kann dies mit der .drop () -Methode effizient implementiert werden?

59
London guy

pandas verfügt über vektorisierte Zeichenfolgenoperationen. Sie können also nur die Zeilen herausfiltern, die die nicht gewünschte Zeichenfolge enthalten:

In [91]: df = pd.DataFrame(dict(A=[5,3,5,6], C=["foo","bar","fooXYZbar", "bat"]))

In [92]: df
Out[92]:
   A          C
0  5        foo
1  3        bar
2  5  fooXYZbar
3  6        bat

In [93]: df[~df.C.str.contains("XYZ")]
Out[93]:
   A    C
0  5  foo
1  3  bar
3  6  bat

Wenn Ihre Zeichenfolgeneinschränkung nicht nur eine Zeichenfolge ist, können Sie die entsprechenden Zeilen mit folgendem Befehl löschen:

df = df[~df['your column'].isin(['list of strings'])]

Oben werden alle Zeilen gelöscht, die Elemente Ihrer Liste enthalten

46
ksooklall

Dies funktioniert nur, wenn Sie genaue Zeichenfolgen vergleichen möchten .. __ Es funktioniert nicht, wenn Sie prüfen möchten, ob die Spaltenzeichenfolge eine der Zeichenfolgen in der Liste enthält.

Der richtige Weg mit einer Liste zu vergleichen wäre: 

searchfor = ['john', 'doe']
df = df[~df.col.str.contains('|'.join(searchfor))]
13
Rupert Schiessl
5
Amy Annine

Leichte Änderung am Code. Mit na = False werden leere Werte übersprungen. Andernfalls erhalten Sie einen Fehler TypeError: ungültiger Operandentyp für unary ~: float

df[~df.C.str.contains("XYZ", na=False)]

Quelle: TypeError: falscher Operandentyp für unäre ~: float

4
Devarshi Mandal

Der folgende Code gibt Ihnen eine Liste aller Zeilen: - 

df[df['C'] != 'XYZ']

So speichern Sie die Werte aus dem obigen Code in einem Datenrahmen: -

newdf = df[df['C'] != 'XYZ']
0
ak3191

wenn Sie nicht alle NaN löschen möchten, verwenden Sie

df[~df.C.str.contains("XYZ") == True]
0
Zhou Ruohua