web-dev-qa-db-fra.com

rechercher "ne contient pas" dans un cadre de données dans pandas

J'ai fait quelques recherches et je ne vois pas comment filtrer une image par df["col"].str.contains(Word), mais je me demande s'il existe un moyen de faire l'inverse: filtrer une image par le complément de cet ensemble. par exemple: à l'effet de !(df["col"].str.contains(Word)).

Cela peut-il être fait via une méthode DataFrame?

89
stites

Vous pouvez utiliser l'opérateur invert (~) (qui agit comme un non pour les données booléennes):

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

, où new_df est la copie renvoyée par RHS.

contient également accepte une expression régulière ...


Si ce qui précède renvoie ValueError, c'est probablement parce que vous avez mélangé des types de données, utilisez donc na=False:

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

Ou,

new_df = df[df["col"].str.contains(Word) == False]
170
Andy Hayden

J'avais aussi des problèmes avec le symbole not (~), alors voici un autre moyen de choisir un autre fil StackOverflow :

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

Vous pouvez utiliser Apply et Lambda pour sélectionner des lignes dans lesquelles une colonne contient un élément quelconque dans une liste. Pour votre scénario:

df[df["col"].apply(lambda x:x not in [Word1,Word2,Word3])]
7
Arash

Je devais me débarrasser des valeurs NULL avant d'utiliser la commande recommandée par Andy ci-dessus. Un exemple:

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

Maintenant, lancez la commande:

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

Je reçois l'erreur suivante:

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

Je me suis débarrassé des valeurs NULL en utilisant dropna () ou fillna () en premier et j'ai réessayé la commande sans problème.

6
Shoresh

J'espère que les réponses sont déjà postées

J'ajoute le cadre pour trouver plusieurs mots et nier ceux de dataFrame.

Ici 'Word1','Word2','Word3','Word4' = liste des motifs à rechercher

df = DataFrame

column_a = Nom de colonne provenant de 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
Nursnaaz

En plus de la réponse de nanselm2, vous pouvez utiliser 0 au lieu de False:

df["col"].str.contains(Word)==0
2
U10-Forward