J'ai un ensemble de données qui ressemble à ceci :

 id      mz_id      time        duration
  1        a        0:00           0:10
  1        a        0:01           0:10
  1        a        0:05           0:10
  1        a        0:07           0:10
  1        a        0:09           0:10
  1        b        5:10           1:10
  1        b        15:10          1:10
  1        b        35:10          1:10
  1        a        1:10:05        0:15
  1        a        1:20:07        0:15
  1        b        2:10:05        1:10
  1        c        3:20:07        0:15

Etc..

Je veux garder la première apparition de la valeur mz_id, pour ressembler à ceci :

 id      mz_id      time        duration
  1        a        0:00           0:10
  1        b        5:10           1:10
  1        a        1:10:05        0:15
  1        b        2:10:05        1:10
  1        c        3:20:07        0:15

La paire mz_id et la durée ne sont pas uniques, et je ne sais pas comment les supprimer dans ce cas... Ma suppression des doublons ne doit être basée que sur - pour toujours conserver la première apparition de mz_id jusqu'à ce qu'elle change.

1
Anajlim 22 janv. 2020 à 19:32

1 réponse

Meilleure réponse

IIUC, utilisez une série d'aides et groupby+first :

df.groupby(df['mz_id'].ne(df['mz_id'].shift()).cumsum()).first().reset_index(drop=True)

   id mz_id     time duration
0   1     a     0:00     0:10
1   1     b     5:10     1:10
2   1     a  1:10:05     0:15
3   1     b  2:10:05     1:10
4   1     c  3:20:07     0:15

Des détails: Vérifier si la ligne suivante est identique à la ligne actuelle, puis effectuer un cumsum() pour attribuer un groupe à chaque groupe modifié, puis regrouper par cette série et revenir en premier

df['mz_id'].ne(df['mz_id'].shift())

0      True
1     False
2     False
3     False
4     False
5      True
6     False
7     False
8      True
9     False
10     True
11     True

Par conséquent, cela retournera vrai pour toute la première ligne qui a la même valeur dans la ligne suivante.

Cependant, comme le souligne @Datanovice, dans votre exemple, ce qui suit fonctionnerait également puisque vous ne faites que prendre la première ligne.

df[df['mz_id'].ne(df['mz_id'].shift())]
3
anky 23 janv. 2020 à 08:54