2013-06-13 9 views
32

Ich habe einige Suche durchgeführt und kann nicht herausfinden, wie man einen Datenrahmen durch df["col"].str.contains(word) filtern, aber ich frage mich, ob es eine Möglichkeit gibt, das zu tun Umgekehrt: filtere einen Datenrahmen um das Kompliment dieses Satzes. zB: zur Wirkung von !(df["col"].str.contains(word)).Suche nach "does-not-contain" auf einem Datenrahmen in Pandas

Kann dies über eine DataFrame Methode erfolgen?

Antwort

51

Sie können das Invertzucker (~) Operator (die wie ein nicht für boolean Daten handelt):

~df["col"].str.contains(word) 

enthält akzeptiert auch einen regulären Ausdruck ...

+1

Perfect! Ich bin SQL-vertraut mit Regex und dachte, dass es anders in Python war - sah viele Artikel mit 're.complies' und sagte mir, dass ich später dazu kommen würde. Sieht aus, als ob ich die Suche überstehe und es ist genau so wie du sagst:) – stites

+3

Vielleicht wäre ein vollständiges Beispiel hilfreich: 'df [~ df.col.str.contains (word)]' gibt eine Kopie des ursprünglichen Datenrahmens mit ausgeschlossenen Zeilen zurück passend zum Wort. –

3

musste ich bekommen Löschen Sie die NULL-Werte, bevor Sie den oben von Andy empfohlenen Befehl verwenden. Ein Beispiel:

df = pd.DataFrame(index = [0, 1, 2], columns=['first', 'second', 'third']) 
df.ix[:, 'first'] = 'myword' 
df.ix[0, 'second'] = 'myword' 
df.ix[2, 'second'] = 'myword' 
df.ix[1, 'third'] = 'myword' 
df 

    first second third 
0 myword myword NaN 
1 myword NaN  myword 
2 myword myword NaN 

läuft nun den Befehl:

~df["second"].str.contains(word) 

ich die folgende Fehlermeldung erhalten:

TypeError: bad operand type for unary ~: 'float' 

I der NULL-Werte mit dropna losgeworden() oder fillna() zuerst und wiederholt den Befehl ohne Probleme.

+1

Sie können auch '~ df [" second "]. Astype (str) .str.contains (word)' verwenden, um die Umwandlung in 'str' zu erzwingen. Siehe https://stackoverflow.com/questions/43568760/pandas-drop-rows-where-column-contains –

17

Ich hatte Probleme mit dem nicht (~) Symbol als auch, so ist hier eine andere Art und Weise von einem anderen StackOverflow thread:

df[df["col"].str.contains('this|that')==False] 
+0

Kann es so kombiniert werden? 'df [df [" col1 "]. str.contains ('dies' | 'das') == False und df [" col2 "]. str.contains ('foo' | 'bar') == True]' ? Vielen Dank! –

+0

Ja, Sie können. Die Syntax wird hier erklärt: https://stackoverflow.com/questions/22086116/how-do-you-filter-pandas-dataframes-by-multiple-columns –

+1

Ich bekomme 'TypeError: nicht unterstützte Operandentyp (en) für |: "str" ​​und "str", vielleicht meinst du "das | das"? –

Verwandte Themen