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]
¿Cómo encuentro, identifico y elimino rápidamente el último duplicado de todos los pares simétricos en este marco de datos?
Un ejemplo de par simétrico es que '(0, 1)' es igual a '(1, 0)'. Este último debe ser eliminado.
El algoritmo debe ser rápido, por lo que se recomienda usar numpy. La conversión a objetos python no está permitida.
symmetric pairs
?df.drop_duplicates()
Respuestas:
Puede ordenar los valores, luego
groupby
:Opción 2 : si tiene muchos pares
c1, c2
,groupby
puede ser lento. En ese caso, podemos asignar nuevos valores y filtrar pordrop_duplicates
:fuente
Una forma es usar
np.unique
conreturn_index=True
y usar el resultado para indexar el marco de datos:fuente
frozenset
fuente
voy a hacer
De pandas y numpy tri
fuente
Aquí hay uno basado en NumPy para enteros:
Si desea mantener los datos del índice tal como están, úselos
return df.iloc[np.sort(sidx[m])]
.Para números genéricos (ints / floats, etc.), usaremos
view-based
uno:y simplemente reemplazar el paso para llegar
idx
conidx = view1D(b)
enremove_symm_pairs
.fuente
Si esto necesita ser rápido , y si sus variables son enteras, entonces el siguiente truco puede ayudar:
v,w
sean las columnas de su vector; construir[v+w, np.abs(v-w)] =: [x, y]
; luego ordene esta matriz lexicográficamente, elimine los duplicados y finalmente vuelva a asignarla[v, w] = [(x+y), (x-y)]/2
.fuente