Pandas: Baisse consécutive des doublons
Quel est le moyen le plus efficace de déposer seulement consécutives doublons dans les pandas?
drop_duplicates donne ça:
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 ce que je veux c':
In [4]: a.something()
Out[4]:
1 1
2 2
4 3
5 2
dtype: int64
Vous devez vous connecter pour publier un commentaire.
Utilisation
maj
:Ci-dessus utilise boolean critère, nous comparons le dataframe contre le dataframe de décalage en -1 lignes pour créer le masque
Une autre méthode consiste à utiliser
diff
:Mais c'est plus lent que l'original de la méthode si vous avez un grand nombre de lignes.
Mise à jour
Grâce à Bjarke Ebert pour souligner une erreur subtile, je dois utiliser
shift(1)
ou tout simplementshift()
que la valeur par défaut est une période de 1, cela renvoie le premier consécutifs de la valeur:Noter la différence entre les valeurs de l'indice, merci @BjarkeEbert!
diff
a été plus lente pour un 50k de la série, probablement en raison de la comparaison de la valeurdf.col != df.col.shift()
est beaucoup plus général. À l'aide dediff
ne fonctionne que pour les entiers alors queshift
travaille pour des flotteurs, des chaînes, etc.np.nan == np.nan
évalue àFalse
. Est-il un moyen de traiter ces valeurs NaN comme à l'identique vide?a.loc[(a.notnull()) & (a.shift() != a)]
pour gérer laNaN
lignesVoici une mise à jour qui permettra de faire le travail avec plusieurs colonnes. Utiliser ".tout(axis=1)" pour combiner les résultats de chaque colonne:
Depuis nous y allons pour
most efficient way
, c'est à dire de la performance, nous allons utiliser un tableau de données pour tirer parti de NumPy. Nous allons tranche d'un arrêt de tranches et de les comparer, de façon similaire à l'évolution de la méthode décrite précédemment dans@EdChum's post
. Mais avec NumPy tranchage on allait se retrouver avec un moins tableau, nous avons donc besoin de concaténer avec unTrue
élément au début pour sélectionner le premier élément, et donc nous aurons une mise en œuvre comme leExemple d'exécution -
Timings sur de grands tableaux comparant
@EdChum de la solution
-Donc, il y a une certaine amélioration de la!
Obtenir grand coup de pouce pour des valeurs à des!
Si seulement les valeurs sont nécessaires, nous avons pu obtenir une impulsion majeure simplement l'indexation dans le tableau de données, comme le
Exemple d'exécution -
Timings -
Get major boost for values only!
section, d'où le temps diff. L'original de travaux sur les pandas de la Série alors que la modification de l'un sur le tableau figurant aussi dans le post.return a[...]
vsreturn ar[....]
. Est-ce que votre fonction de travail pour dataframes?slicing
:ar[:,:-1]!= ar[:,1:]
, alongwithALL
de réduction.Pour d'autres de la Pile des explorateurs, s'appuyant sur les johnml1135 la réponse ci-dessus. Cela permettra d'éliminer la prochaine double à partir de plusieurs colonnes, mais pas de chute de toutes les colonnes. Lorsque le dataframe est triée il conservera la première rangée, mais baisse de la deuxième ligne si les "cols" match, même si il y a plus de colonnes avec les informations de correspondance.