114 votes

Pandas: Supprimer les doublons consécutifs

Quel est le moyen le plus efficace de supprimer uniquement les doublons consécutifs dans pandas?

drop_duplicates donne ceci:

In [3]: a = pandas.Series([1,2,2,3,2], index=[1,2,3,4,5])

In [4]: a.drop_duplicates()
Out[4]: 
1    1
2    2
4    3
dtype: int64

Mais je veux ceci:

In [4]: a.something()
Out[4]: 
1    1
2    2
4    3
5    2
dtype: int64

1voto

Florian Brucker Points 2383

Voici une variante de la réponse d'EdChum qui traite également les NaN consécutifs comme des doublons :

def remove_consecutive_duplicates_and_nans(s):
    # Par défaut, `shift` utilise NaN comme valeur de remplissage, ce qui casse notre
    # suppression des NaN consécutifs. Nous utilisons donc un autre objet sentinelle à la place.
    shifted = s.astype(object).shift(-1, fill_value=object())
    return s.loc[
        (shifted != s)
        & ~(shifted.isna() & s.isna())
    ]

1voto

pugach Points 11

Créer une nouvelle colonne.

df['match'] = df.col1.eq(df.col1.shift())

Ensuite:

df = df[df['match']==False]

0voto

Avral Points 19

L'approche recommandée par @johnml1135 ne fonctionne pas pour moi.

Cependant, j'ai trouvé une approche similaire :

cols = ['Position', 'Offset']
df = df[df[cols] != df[cols].shift(-1)].dropna()

shift(-1) conservera la dernière ligne dupliquée, et shift(1) conservera la première ligne.

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