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
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!
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)]