2013-06-13 18 views
32

Ho fatto qualche ricerca e non riesco a capire come filtrare un dataframe da df["col"].str.contains(word), tuttavia mi chiedo se c'è un modo per fare il reverse: filtra un dataframe con il complimento di quel set. ad es .: per l'effetto di !(df["col"].str.contains(word)).cerca "non-contiene" su un dataframe in panda

È possibile farlo tramite un metodo DataFrame?

risposta

51

È possibile utilizzare l'operatore invertito (~) (che agisce come un dato non per boolean):

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

contiene anche accetta un'espressione regolare ...

+1

Perfetto! Ho familiarità con SQL regex e ho pensato che fosse diverso in Python - ho visto molti articoli con 're.complies' e mi sono detto che ci sarei riuscito dopo. Sembra che io vada oltre la ricerca ed è proprio come dici tu:) – stites

+3

Forse un esempio completo sarebbe utile: 'df [~ df.col.str.contains (word)]' restituisce una copia del dataframe originale con le righe escluse abbinare la parola. –

3

ho dovuto ottenere liberare i valori NULL prima di utilizzare il comando consigliato da Andy sopra. Un esempio:

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 

Ora eseguendo il comando:

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

ottengo il seguente errore:

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

mi sono liberato dei valori NULL utilizzando dropna() o fillna() prima e ritentato il comando senza problemi.

+1

Puoi anche usare '~ df [" second "]. Astype (str) .str.contains (word)' per forzare la conversione in 'str'. Vedi https://stackoverflow.com/questions/43568760/pandas-drop-rows-where-column-taintains –

17

stavo avendo problemi con il simbolo non (~), così, ecco un altro modo da un altro StackOverflow thread:

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

Può essere combinato in questo modo? 'df [df [" col1 "]. str.contains ('this' | 'that') == False e df [" col2 "]. str.contains ('foo' | 'bar') == True]' ? Grazie! –

+0

Sì, è possibile. La sintassi è spiegata qui: https://stackoverflow.com/questions/22086116/how-do-you-filter-pandas-dataframes-by-multiple-columns –

+1

Ottiene 'TypeError: tipo di operando non supportato per |: 'str' e 'str'', forse intendi '' this | that''? –