Cerca "non-contiene" su un DataFrame in Panda


142

Ho fatto qualche ricerca e non riesco a capire come filtrare un frame di dati df["col"].str.contains(word), tuttavia mi chiedo se c'è un modo per fare il contrario: filtrare un frame di dati in base al complimento di quel set. ad es .: per l'effetto di !(df["col"].str.contains(word)).

Questo può essere fatto attraverso un DataFramemetodo?

Risposte:


264

È possibile utilizzare l'operatore invert (~) (che si comporta come un dato non booleano):

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

, dove si new_dftrova la copia restituita da RHS.

contiene accetta anche un'espressione regolare ...


Se quanto sopra genera un ValueError, è probabile che il motivo sia dovuto a tipi di dati misti, quindi utilizzare na=False:

new_df = df[~df["col"].str.contains(word, na=False)]

O,

new_df = df[df["col"].str.contains(word) == False]

1
Perfetto! Conosco SQL con regex e ho pensato che fosse diverso in Python - ho visto molti articoli re.compliese mi sono detto che ci sarei arrivato più tardi. Sembra che io abbia sovralimentato la ricerca ed è proprio come dici tu
:)

6
Forse un esempio completo sarebbe utile: df[~df.col.str.contains(word)]restituisce una copia del dataframe originale con le righe escluse che corrispondono alla parola.
Dennis Golomazov,

45

Avevo problemi anche con il simbolo non (~), quindi ecco un altro modo da un altro thread StackOverflow :

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

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

Si, puoi. La sintassi è spiegato qui: stackoverflow.com/questions/22086116/...
tommy.carstensen

Non dimenticare che se vogliamo rwmove le righe che contengono "|" dovremmo usare "\" come df = df[~df["col"].str.contains('\|')]
Amir il

9

Puoi usare Apply e Lambda per selezionare le righe in cui una colonna contiene qualcosa in un elenco. Per il tuo scenario:

df[df["col"].apply(lambda x:x not in [word1,word2,word3])]

6

Ho dovuto sbarazzarmi dei 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 sbarazzato dei valori NULL usando dropna () o fillna () prima e ho ripetuto il comando senza problemi.


1
Puoi anche usare ~df["second"].astype(str).str.contains(word)per forzare la conversione in str. Vedi stackoverflow.com/questions/43568760/…
David C

1
@Shoresh possiamo anche usare na = False come soluzione a questo problema
Vishav Gupta,

5

Spero che le risposte siano già state pubblicate

Sto aggiungendo il framework per trovare più parole e negare quelle di dataFrame .

Qui 'word1','word2','word3','word4'= elenco di modelli da cercare

df = DataFrame

column_a = Un nome di colonna da DataFrame df

Search_for_These_values = ['word1','word2','word3','word4'] 

pattern = '|'.join(Search_for_These_values)

result = df.loc[~(df['column_a'].str.contains(pattern, case=False)]

3

Oltre alla risposta di nanselm2, è possibile utilizzare 0invece di False:

df["col"].str.contains(word)==0

sembra che anche questo rimuova tutte le righe conNaN
bshelt141
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.