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
4
user3476463 16 avril 2018 à 03:33

3 réponses

Meilleure réponse

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
6
YOBEN_S 16 avril 2018 à 00:41

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
2
piRSquared 16 avril 2018 à 05:21

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
2
cs95 16 avril 2018 à 01:23