234 votes

Recherche de "does-not-contain" sur un DataFrame dans pandas

J'ai fait quelques recherches et je n'arrive pas à trouver comment filtrer un cadre de données en fonction des critères suivants

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

Cependant, je me demande s'il n'y a pas un moyen de faire l'inverse : filtrer un cadre de données en fonction des compliments de cet ensemble.

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

Cela peut-il se faire par le biais d'un DataFrame méthode ?

452voto

Andy Hayden Points 38010

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

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

donde new_df est la copie renvoyée par RHS.

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


Si l'opération ci-dessus donne lieu à une ValueError, c'est probablement parce que vous avez mélangé les types de données. na=False :

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

Ou,

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

79voto

nanselm2 Points 593

J'avais aussi des problèmes avec le symbole pas (~), alors voici une autre façon de faire d'un autre Fil de discussion StackOverflow :

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

17voto

Arash Points 156

Vous pouvez utiliser Apply et Lambda :

df[df["col"].apply(lambda x: word not in x)]

Ou si vous voulez définir une règle plus complexe, vous pouvez utiliser AND :

df[df["col"].apply(lambda x: word_1 not in x and word_2 not in x)]

15voto

Nursnaaz Points 890

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

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

Aquí 'word1','word2','word3','word4' = liste de motifs à rechercher

df = DataFrame

column_a = Un nom de colonne de DataFrame df

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

pattern = '|'.join(values_to_remove)

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

8voto

Shoresh Points 2015

J'ai dû 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, exécutez 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() d'abord et j'ai réessayé la commande sans problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X