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 ()?
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
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.
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))]
new_df = df[df.C != 'XYZ']
Référence: https://chrisalbon.com/python/data_wrangling/pandas_dropping_column_and_rows/
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
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']
si vous ne voulez pas supprimer tous les NaN, utilisez
df[~df.C.str.contains("XYZ") == True]