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]
Как быстро найти, идентифицировать и удалить последний дубликат всех симметричных пар в этом фрейме данных?
Примером симметричной пары является то, что '(0, 1)' равно '(1, 0)'. Последний должен быть удален.
Алгоритм должен быть быстрым, поэтому рекомендуется использовать numpy. Преобразование в объект python не допускается.
symmetric pairs
?df.drop_duplicates()
Ответы:
Вы можете отсортировать значения, затем
groupby
:Вариант 2 : если у вас много пар
c1, c2
,groupby
может быть медленным. В этом случае мы можем назначить новые значения и отфильтровать поdrop_duplicates
:источник
Одним из способов является использование
np.unique
сreturn_index=True
и использование результата для индексации фрейма данных:источник
frozenset
источник
я сделаю
Из панд и ноль
источник
Вот один на основе NumPy для целых чисел -
Если вы хотите сохранить данные индекса как есть, используйте
return df.iloc[np.sort(sidx[m])]
.Для общих чисел (целые числа / числа с плавающей запятой и т. Д.) Мы будем использовать
view-based
одно -и просто заменить шаг , чтобы получить
idx
сidx = view1D(b)
вremove_symm_pairs
.источник
Если это должно быть быстро , и если ваши переменные являются целочисленными, то может помочь следующий трюк: пусть
v,w
будут столбцы вашего вектора; построить[v+w, np.abs(v-w)] =: [x, y]
; затем отсортируйте эту матрицу лексикографически, удалите дубликаты и, наконец, сопоставьте ее с[v, w] = [(x+y), (x-y)]/2
.источник