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]
Wie finde, identifiziere und entferne ich schnell das letzte Duplikat aller symmetrischen Paare in diesem Datenrahmen?
Ein Beispiel für ein symmetrisches Paar ist, dass '(0, 1)' gleich '(1, 0)' ist. Letzteres sollte entfernt werden.
Der Algorithmus muss schnell sein, daher wird empfohlen, numpy zu verwenden. Das Konvertieren in ein Python-Objekt ist nicht zulässig.
symmetric pairs
?df.drop_duplicates()
Antworten:
Sie können die Werte dann sortieren
groupby
:Option 2 : Wenn Sie viele Paare haben
c1, c2
,groupby
kann dies langsam sein. In diesem Fall können wir neue Werte zuweisen und filtern nachdrop_duplicates
:quelle
Eine Möglichkeit besteht darin, den Datenrahmen
np.unique
mitreturn_index=True
zu indizieren und das Ergebnis zu indizieren:quelle
frozenset
quelle
Ich werde tun
Von Pandas und Numpy Tri
quelle
Hier ist eine NumPy-basierte für Ganzzahlen -
Wenn Sie die Indexdaten unverändert lassen möchten, verwenden Sie
return df.iloc[np.sort(sidx[m])]
.Für generische Zahlen (Ints / Floats usw.) verwenden wir eine
view-based
Eins -und ersetzen Sie einfach den Schritt zu bekommen
idx
mitidx = view1D(b)
inremove_symm_pairs
.quelle
Wenn dies schnell sein muss und Ihre Variablen ganzzahlig sind, kann der folgende Trick hilfreich sein: Lassen Sie
v,w
die Spalten Ihres Vektors sein; konstruieren[v+w, np.abs(v-w)] =: [x, y]
; Sortieren Sie diese Matrix dann lexikografisch, entfernen Sie Duplikate und ordnen Sie sie schließlich wieder zu[v, w] = [(x+y), (x-y)]/2
.quelle