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]
Como localizo, identifico e removo rapidamente a última duplicata de todos os pares simétricos nesse quadro de dados?
Um exemplo de par simétrico é que '(0, 1)' é igual a '(1, 0)'. Este último deve ser removido.
O algoritmo deve ser rápido, por isso é recomendável usar numpy. A conversão para objeto python não é permitida.
symmetric pairs
?df.drop_duplicates()
Respostas:
Você pode classificar os valores e, em seguida
groupby
:Opção 2 : se você tiver muitos pares
c1, c2
,groupby
pode ser lento. Nesse caso, podemos atribuir novos valores e filtrar pordrop_duplicates
:fonte
Uma maneira é usar
np.unique
comreturn_index=True
e usar o resultado para indexar o quadro de dados:fonte
frozenset
fonte
eu farei
De pandas e tri numpy
fonte
Aqui está um baseado em NumPy para números inteiros -
Se você deseja manter os dados do índice como estão, use
return df.iloc[np.sort(sidx[m])]
.Para números genéricos (ints / floats, etc.), usaremos
view-based
um -e simplesmente substituir o passo para chegar
idx
comidx = view1D(b)
noremove_symm_pairs
.fonte
Se isso precisar ser rápido , e se suas variáveis forem inteiras, o seguinte truque pode ajudar:
v,w
sejam as colunas do seu vetor; construir[v+w, np.abs(v-w)] =: [x, y]
; em seguida, classifique essa matriz lexicograficamente, remova duplicatas e, finalmente, mapeie-a novamente[v, w] = [(x+y), (x-y)]/2
.fonte