2 votes

Trouver le premier élément non nul dans un groupe dans pandas

J'ai un dataframe que vous pouvez voir ci-dessous. La colonne nommée target est ma colonne désirée :

group    value    target

  1        1        0
  1        2        0
  1        3        2
  1        4        0
  1        5        1
  2        1        0
  2        2        0
  2        3        0
  2        4        1
  2        5        3

Maintenant je veux trouver la première valeur non nulle dans la colonne target pour chaque groupe et supprimer les lignes avant cette ligne dans chaque groupe. Donc la sortie devrait être comme ceci :

group    value    target

  1        3        2
  1        4        0
  1        5        1
  2        4        1
  2        5        3

J'ai vu ce post, mais je ne sais pas comment modifier le code pour obtenir le résultat souhaité.
Comment puis-je faire cela ?

2voto

sammywemmy Points 14854

Dans le groupby, définissez sort à False, obtenez le cumsum, puis filtrez les lignes différentes de 0 :

df.loc[df.groupby(["group"], sort=False).target.cumsum() != 0]

    group   value   target
2      1       3    2
3      1       4    0
4      1       5    1
8      2       4    1
9      2       5    3

1voto

Juan C Points 2821

Cela devrait fonctionner. Je suis sûr que vous pouvez le faire avec moins de reset_index(), mais cela ne devrait pas trop affecter la vitesse si votre dataframe n'est pas trop grand :

idx = dff[dff.target.ne(0)].reset_index().groupby('group').index.first()
mask = (dff.reset_index().set_index('group')['index'].ge(idx.to_frame()['index'])).values
df_final = dff[mask]

Résultat:

0  group value  target
3      1     3       2
4      1     4       0
5      1     5       1
9      2     4       1
10     2     5       3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X