2013-06-13 19 views
32

Zrobiłem kilka wyszukiwania i nie mogę wymyślić, jak filtrować ramkę danych przez df["col"].str.contains(word), ale zastanawiam się, czy jest sposób, aby zrobić reverse: filtruj ramkę danych według komplementu tego zestawu. np. do skutku !(df["col"].str.contains(word)).Wyszukiwanie "nie-zawiera" na ramce danych w pandach

Czy można to zrobić za pomocą metody DataFrame?

Odpowiedz

51

Można użyć inwertowanego (~) operatora (która działa jak nie dla logicznych danych):

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

zawiera również akceptuje wyrażenia regularnego ...

+1

Perfect! Jestem SQL-a zaznajomiony z regex i myślałem, że jest inaczej w Pythonie - widziałem wiele artykułów z 're.complies' i powiedziałem sobie, że dostanę się do tego później. Wygląda na to, że przeszukuję wyszukiwanie i jest tak, jak mówisz:) – stites

+3

Może byłby pełny przykład: 'df [~ df.col.str.contains (word)]' zwraca kopię oryginalnej ramki danych z wykluczonymi wierszami pasujące do słowa. –

3

musiałem dostać pozbyć się wartości NULL przed użyciem polecenia zalecanego przez Andiego powyżej. Przykład:

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 

Teraz uruchamiając polecenie:

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

pojawia się następujący błąd:

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

Pozbyłem wartości NULL za pomocą dropna() lub fillna() pierwszy i ponowił polecenie bez problemu.

+1

Możesz także użyć '~ df [" second "]. Astype (str) .str.contains (word)', aby wymusić konwersję na 'str'. Zobacz https://stackoverflow.com/questions/43568760/pandas-drop-rows-where-column-contains –

17

miałem problemy z NOT (~) symbolem, tak więc oto inny sposób z innej StackOverflow thread:

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

Czy można to połączyć w ten sposób? 'df [df [" col1 "]. str.contains ('this' | that ') == Fałsz i df [" col2 "]. str.contains (' foo '|' bar ') == True]' ? Dzięki! –

+0

Tak, możesz. Składnia jest wyjaśniona tutaj: https://stackoverflow.com/questions/22086116/how-do-you-filter-pandas-dataframes-by-multiple-columns –

+1

Otrzymuję 'TypeError: unsupported typ (typy) argumentu dla |: 'str' i 'str'', może masz na myśli '' to | to '? –

Powiązane problemy