2017-09-14 1 views
2

Comment puis-je supprimer toutes les lignes d'une trame si une ligne contient '9999-Ne sait pas' dans une colonne?Supprimer toutes les lignes de l'image Panda avec des types de données mixtes contenant une chaîne spécifique dans plusieurs colonnes

J'ai pu trouver des solutions qui suppriment des lignes en fonction du format de valeur (chaîne, numérique, etc.) dans l'ensemble de la structure, ou supprimer des lignes en fonction de valeurs dans une colonne spécifique ou supprimer des lignes d'une base de données a quelques colonnes en utilisant leurs noms.

This est la chose la plus proche que j'ai trouvé mais cette solution ne fonctionne pas pour moi parce que je ne peux pas entrer tous les noms de colonnes en raison du volume (76+ colonnes).

est Ci-dessous un ensemble de données exemple

pd.DataFrame.from_items([('RespondentId', ['1ghi3g','335hduu','4vlsiu4','5nnvkkt','634deds','7kjng']), ('Satisfaction - Timing', ['9-Excellent','9-Excellent','9999-Don\'t Know','8-Very Good','1-Very Unsatisfied','9999-Don\'t Know']),('Response Speed - Time',['9999-Don\'t Know','9999-Don\'t Know','9-Excellent','9-Excellent','9-Excellent','9-Excellent'])]) 

Après avoir enlevé les 4 lignes qui contiennent « Know 9999-ne », la sortie devrait ressembler à cela, je peux écrire un nouveau fichier Excel avec le nettoyé Les données.

pd.DataFrame.from_items([('RespondentId', ['5nnvkkt','634deds']), ('Satisfaction - Timing', ['8-Very Good','1-Very Unsatisfied']),('Response Speed - Time',['9-Excellent','9-Excellent'])]) 

Répondre

5

Utilisez

In [677]: df[~(df == "9999-Don't Know").any(axis=1)] 
Out[677]: 
    RespondentId Satisfaction - Timing Response Speed - Time 
3  5nnvkkt   8-Very Good   9-Excellent 
4  634deds 1-Very Unsatisfied   9-Excellent 

Ou

In [683]: df[(df != "9999-Don't Know").all(axis=1)] 
Out[683]: 
    RespondentId Satisfaction - Timing Response Speed - Time 
3  5nnvkkt   8-Very Good   9-Excellent 
4  634deds 1-Very Unsatisfied   9-Excellent 

Identique

In [686]: df[~df.eq("9999-Don't Know").any(axis=1)] 
Out[686]: 
    RespondentId Satisfaction - Timing Response Speed - Time 
3  5nnvkkt   8-Very Good   9-Excellent 
4  634deds 1-Very Unsatisfied   9-Excellent 

Ou

In [687]: df[df.ne("9999-Don't Know").all(axis=1)] 
Out[687]: 
    RespondentId Satisfaction - Timing Response Speed - Time 
3  5nnvkkt   8-Very Good   9-Excellent 
4  634deds 1-Very Unsatisfied   9-Excellent 

Avec les types de colonnes mixtes, voir @ commentaire de PiR df.astype(object)

In [695]: df[df.astype(object).ne("9999-Don't Know").all(axis=1)] 
Out[695]: 
    RespondentId Satisfaction - Timing Response Speed - Time 
3  5nnvkkt   8-Very Good   9-Excellent 
4  634deds 1-Very Unsatisfied   9-Excellent 
+1

Dans le cas où vous avez mélangé '' utiliser dtype' ... df.astype (objet) .ne ("9999- Je ne sais pas "). Tous (axe = 1)' – piRSquared

+0

@John Galt. Merci pour la solution mais cela n'a pas fonctionné. J'ai le TypeError: Impossible de comparer ["9999-Ne sais pas"] avec des valeurs de bloc. J'ai eu la même erreur quand j'essayais de compter le nombre de lignes qui avaient cette chaîne. Toute cette question peut être trouvée [ici] (https://stackoverflow.com/questions/46220656/counting-total-rows-in-pandas-dataframe-with-the-same-string-value-in-multiple-c) – techscolasticus

+0

J'essayais la solution avec le remplacement mais c'est très rapide. +1 – Vaishali