from itertools import product
import pandas as pd
df = pd.DataFrame.from_records(product(range(10), range(10)))
df = df.sample(90)
df.columns = "c1 c2".split()
df = df.sort_values(df.columns.tolist()).reset_index(drop=True)
# c1 c2
# 0 0 0
# 1 0 1
# 2 0 2
# 3 0 3
# 4 0 4
# .. .. ..
# 85 9 4
# 86 9 5
# 87 9 7
# 88 9 8
# 89 9 9
#
# [90 rows x 2 columns]
Comment trouver, identifier et supprimer rapidement le dernier doublon de toutes les paires symétriques de cette trame de données?
Un exemple de paire symétrique est que «(0, 1)» est égal à «(1, 0)». Ce dernier doit être supprimé.
L'algorithme doit être rapide, il est donc recommandé d'utiliser numpy. La conversion en objet python n'est pas autorisée.
symmetric pairs
?df.drop_duplicates()
Réponses:
Vous pouvez trier les valeurs, puis
groupby
:Option 2 : Si vous avez beaucoup de paires
c1, c2
, celagroupby
peut être lent. Dans ce cas, nous pouvons attribuer de nouvelles valeurs et filtrer pardrop_duplicates
:la source
Une façon consiste à utiliser
np.unique
avecreturn_index=True
et à utiliser le résultat pour indexer la trame de données:la source
frozenset
la source
je ferai
De pandas et numpy tri
la source
En voici un basé sur NumPy pour les entiers -
Si vous souhaitez conserver les données d'index telles quelles, utilisez
return df.iloc[np.sort(sidx[m])]
.Pour les nombres génériques (ints / float, etc.), nous utiliserons un
view-based
-et remplacer simplement l'étape pour obtenir
idx
avecidx = view1D(b)
enremove_symm_pairs
.la source
Si cela doit être rapide , et si vos variables sont entières, alors l'astuce suivante peut vous aider:
v,w
soit les colonnes de votre vecteur; construire[v+w, np.abs(v-w)] =: [x, y]
; puis triez cette matrice lexicographiquement, supprimez les doublons et enfin mappez-la à nouveau[v, w] = [(x+y), (x-y)]/2
.la source