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]
Bagaimana cara cepat menemukan, mengidentifikasi, dan menghapus duplikat terakhir dari semua pasangan simetris dalam bingkai data ini?
Contoh pasangan simetris adalah '(0, 1)' sama dengan '(1, 0)'. Yang terakhir harus dihapus.
Algoritma harus cepat, jadi disarankan untuk menggunakan numpy. Konversi ke objek python tidak diizinkan.
symmetric pairs
?df.drop_duplicates()
Jawaban:
Anda dapat mengurutkan nilai, lalu
groupby
:Opsi 2 : Jika Anda memiliki banyak pasangan
c1, c2
,groupby
bisa lambat. Dalam hal ini, kami dapat menetapkan nilai baru dan memfilter menurutdrop_duplicates
:sumber
Salah satu cara menggunakan
np.unique
denganreturn_index=True
dan menggunakan hasilnya untuk mengindeks kerangka data:sumber
frozenset
sumber
Saya akan lakukan
Dari panda dan numpy tri
sumber
Inilah satu berbasis NumPy untuk bilangan bulat -
Jika Anda ingin menyimpan data indeks apa adanya, gunakan
return df.iloc[np.sort(sidx[m])]
.Untuk nomor generik (ints / float, dll.), Kami akan menggunakan
view-based
satu -dan hanya mengganti langkah untuk mendapatkan
idx
denganidx = view1D(b)
diremove_symm_pairs
.sumber
Jika ini perlu cepat , dan jika variabel Anda integer, maka trik berikut ini dapat membantu: biarkan
v,w
menjadi kolom vektor Anda; membangun[v+w, np.abs(v-w)] =: [x, y]
; kemudian urutkan matriks ini secara leksikografis, hapus duplikat, dan akhirnya petakan kembali[v, w] = [(x+y), (x-y)]/2
.sumber