2014-01-10 4 views

Antwort

24

können Sie die Tilde ~ die Bool-Werte leicht zu schlagen:

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]}) 
>>> df.A.str.contains("Hello|World") 
0  True 
1 False 
2  True 
3 False 
Name: A, dtype: bool 
>>> ~df.A.str.contains("Hello|World") 
0 False 
1  True 
2 False 
3  True 
Name: A, dtype: bool 
>>> df[~df.A.str.contains("Hello|World")] 
     A 
1 this 
3 apple 

[2 rows x 1 columns] 

Ob dies der effizienteste Weg ist, weiß ich nicht; Sie müssten es gegen Ihre anderen Optionen abmessen. Manchmal ist das Verwenden eines regulären Ausdrucks langsamer als Dinge wie df[~(df.A.str.contains("Hello") | (df.A.str.contains("World")))], aber ich bin schlecht darin zu erraten, wo die Übergänge sind.

+0

Viel besser als ein verschachtelter negativer Lookaround-Test. Keine Erfahrung mit Pandas selbst, also habe ich keine Ahnung, was der schnellere Ansatz wäre. –

+1

Der Regex-Lookaround-Test dauerte deutlich länger (etwa 30s vs 20s), und die beiden Methoden haben anscheinend leicht unterschiedliche Ergebnisse (3663K Ergebnis vs 3504K - von ~ 3G Original - haben nicht gesehen, um Details zu sehen). – Xodarap777

+0

@DSM Ich habe dieses '~' Symbol viele Male gesehen, speziell in JavaScript. Habe nicht in Python gesehen. Was bedeutet es genau? – estebanpdl

7

Die .contains() Methode verwendet reguläre Ausdrücke, so können Sie eine negative lookahead test zu bestimmen, verwenden, dass ein Wort ist nicht enthalten:

df['A'].str.contains(r'^(?:(?!Hello|World).)*$') 

Dieser Ausdruck passt zu jedem String, wo die Wörter Hello und World sind nicht irgendwo in der Zeichenfolge gefunden.

Demo:

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]}) 
>>> df['A'].str.contains(r'^(?:(?!Hello|World).)*$') 
0 False 
1  True 
2 False 
3  True 
Name: A, dtype: bool 
>>> df[df['A'].str.contains(r'^(?:(?!Hello|World).)*$')] 
     A 
1 this 
3 apple 
+0

Ich habe 'C: \ Python27 \ lib \ Site-Pakete \ Pandas \ core \ strings.py: 176: UserWarning: Dieses Muster hat Match-Gruppen. Um die Gruppen tatsächlich zu erhalten, verwenden Sie str.extract. – Xodarap777

+1

Hat die Gruppe nicht erfasst. –