web-dev-qa-db-fra.com

Comment supprimer des lignes du cadre de données pandas contenant une chaîne particulière dans une colonne donnée?

J'ai un très grand cadre de données en python et je veux supprimer toutes les lignes contenant une chaîne particulière dans une colonne particulière.

Par exemple, je veux supprimer toutes les lignes qui ont la chaîne "XYZ" en tant que sous-chaîne dans la colonne C du cadre de données.

Cela peut-il être implémenté de manière efficace en utilisant la méthode .drop ()?

59
London guy

pandas a des opérations de chaîne vectorisées, vous pouvez donc filtrer les lignes contenant la chaîne que vous ne voulez pas:

In [91]: df = pd.DataFrame(dict(A=[5,3,5,6], C=["foo","bar","fooXYZbar", "bat"]))

In [92]: df
Out[92]:
   A          C
0  5        foo
1  3        bar
2  5  fooXYZbar
3  6        bat

In [93]: df[~df.C.str.contains("XYZ")]
Out[93]:
   A    C
0  5  foo
1  3  bar
3  6  bat
96

Si votre contrainte de chaîne n'est pas une chaîne, vous pouvez supprimer les lignes correspondantes avec:

df = df[~df['your column'].isin(['list of strings'])]

Ce qui précède supprimera toutes les lignes contenant des éléments de votre liste.

46
ksooklall

Cela ne fonctionnera que si vous souhaitez comparer des chaînes exactes . Cela ne fonctionnera pas si vous souhaitez vérifier si la chaîne de la colonne contient l'une des chaînes de la liste.

La bonne façon de comparer avec une liste serait: 

searchfor = ['john', 'doe']
df = df[~df.col.str.contains('|'.join(searchfor))]
13
Rupert Schiessl
5
Amy Annine

Légère modification du code. Avoir na = False ignorera les valeurs vides. Sinon, vous pouvez obtenir une erreur TypeError: type d'opérande incorrect pour unaire ~: float

df[~df.C.str.contains("XYZ", na=False)]

Source: TypeError: type d'opérande incorrect pour unaire ~: float

4
Devarshi Mandal

Le code ci-dessous vous donnera la liste de toutes les lignes: - 

df[df['C'] != 'XYZ']

Pour stocker les valeurs du code ci-dessus dans un cadre de données: -

newdf = df[df['C'] != 'XYZ']
0
ak3191

si vous ne voulez pas supprimer tous les NaN, utilisez

df[~df.C.str.contains("XYZ") == True]
0
Zhou Ruohua