Pandas: supprimer les doublons consécutifs

Quel est le moyen le plus efficace de supprimer uniquement les doublons consécutifs dans les 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
28
demandé sur Thomas Johnson 2013-10-19 12:19:56

2 réponses

Utiliser shift:

a.loc[a.shift(-1) != a]

Out[3]:

1    1
3    2
4    3
5    2
dtype: int64

Donc ce qui précède utilise la critieria booléenne, nous comparons le dataframe contre le dataframe décalé de -1 lignes pour créer le masque

Une Autre méthode consiste à utiliser diff:

In [82]:

a.loc[a.diff() != 0]
Out[82]:
1    1
2    2
4    3
5    2
dtype: int64

Mais c'est plus lent que la méthode d'origine si vous avez un grand nombre de lignes.

Mise à Jour

Merci à Bjarke Ebert pour avoir signalé une erreur subtile, je devrais en fait utiliser shift(1) ou simplement {[6] } car la valeur par défaut est une période de 1, cela renvoie la première valeur consécutive:

In [87]:

a.loc[a.shift() != a]
Out[87]:
1    1
2    2
4    3
5    2
dtype: int64

Notez la différence dans les valeurs d'index, merci @ BjarkeEbert!

47
répondu EdChum 2017-09-11 19:05:50

Voici une mise à jour qui le fera fonctionner avec plusieurs colonnes. Utiliser ".tout(axis=1)" pour combiner les résultats de chaque colonne:

cols = ["col1","col2","col3"]
de_dup = a[cols].loc[(a[cols].shift() != a[cols]).any(axis=1)]
4
répondu johnml1135 2016-11-01 12:01:09