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]
Jak szybko znaleźć, zidentyfikować i usunąć ostatni duplikat wszystkich par symetrycznych w tej ramce danych?
Przykładem pary symetrycznej jest to, że „(0, 1)” jest równe „(1, 0)”. Ten ostatni należy usunąć.
Algorytm musi być szybki, dlatego zaleca się użycie numpy. Konwersja na obiekt python jest niedozwolona.
symmetric pairs
?df.drop_duplicates()
Odpowiedzi:
Możesz posortować wartości, a następnie
groupby
:Opcja 2 : jeśli masz wiele par
c1, c2
,groupby
może być powolny. W takim przypadku możemy przypisać nowe wartości i filtrować wedługdrop_duplicates
:źródło
Jednym ze sposobów jest użycie
np.unique
zreturn_index=True
i wykorzystać wynik do indeksowania dataframe:źródło
frozenset
źródło
zrobię
Od pand i numpy tri
źródło
Oto jeden oparty na NumPy dla liczb całkowitych -
Jeśli chcesz zachować dane indeksu bez zmian, użyj
return df.iloc[np.sort(sidx[m])]
.W przypadku liczb ogólnych (ints / floats itp.) Użyjemy
view-based
jednego -i po prostu zastąpić krok, aby dostać
idx
sięidx = view1D(b)
wremove_symm_pairs
.źródło
Jeśli to musi być szybkie , a twoje zmienne są liczbami całkowitymi, może pomóc następująca sztuczka: niech
v,w
będą kolumny wektora; konstruować[v+w, np.abs(v-w)] =: [x, y]
; następnie posortuj tę matrycę leksykograficznie, usuń duplikaty, a na końcu zamapuj ją z powrotem[v, w] = [(x+y), (x-y)]/2
.źródło