J'ai une trame de données qui a beaucoup de 0, comme l'exemple df ci-dessous. Je voudrais supprimer n'importe quelle ligne qui a 0 dans trois colonnes ou plus, comme l'exemple Resultdf ci-dessous.
Le script ci-dessous supprimera tous les enregistrements qui sont tous 0
df = df[(df.T != 0).any()]
Existe-t-il un moyen de le modifier afin qu'il supprime les enregistrements qui sont tous à 0, ou qui ont trois colonnes ou plus avec 0? Ou existe-t-il une autre façon de procéder?
Imprimer df:
ind_key prtCnt fldCnt TmCnt bmCnt
1 0 0 0 0
2 2 0 0 3
3 0 1 0 0
4 0 1 1 0
Imprimer Resultdf:
ind_key prtCnt fldCnt TmCnt bmCnt
2 2 0 0 3
4 0 1 1 0
3 réponses
Vous pouvez utiliser sum
avec axis = 1
df[df.eq(0).sum(1)<3] # eq mean '=='
Out[523]:
ind_key prtCnt fldCnt TmCnt bmCnt
1 2 2 0 0 3
3 4 0 1 1 0
Utilisation intelligente de numpy.argpartition
. Nous commençons avec un tableau booléen où les choses ne sont pas égales à zéro. Ensuite, nous partitionnons chaque ligne en trois valeurs les plus faibles et le reste. S'il y a au moins 3 zéros, alors les trois premiers éléments reviendront faux.
df[~(df.values != 0).argpartition(3, 1)[:, :3].all(1)]
ind_key prtCnt fldCnt TmCnt bmCnt
1 2 2 0 0 3
3 4 0 1 1 0
Utilisez l'idiomatique dropna
avec le jeu d'indicateurs thresh
:
df[df != 0].dropna(thresh=len(df.columns) - 2, axis=0)
ind_key prtCnt fldCnt TmCnt bmCnt
1 2 2.0 NaN NaN 3.0
3 4 NaN 1.0 1.0 NaN
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.