python - सुम्पी[डुप्लीकेट] में जल्दी से सममित जोड़े खोजें




pandas numpy (4)

frozenset

mask = pd.Series(map(frozenset, zip(df.c1, df.c2))).duplicated()

df[~mask]
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) बराबर है। बाद को हटा दिया जाना चाहिए।

इसे तेज करने की आवश्यकता है, इसलिए सुन्न समाधान की सराहना की जाती है। अजगर वस्तुओं में परिवर्तित नहीं कृपया :)


आप मानों को क्रमबद्ध कर सकते हैं, फिर समूह बना सकते हैं:

a= np.sort(df.to_numpy(), axis=1)
df.groupby([a[:,0], a[:,1]], as_index=False, sort=False).first()

विकल्प 2 : यदि आपके पास बहुत सारे जोड़े हैं c1, c2 , groupby धीमा हो सकता है। उस स्थिति में, हम drop_duplicates द्वारा नए मान और फ़िल्टर असाइन कर सकते हैं:

a= np.sort(df.to_numpy(), axis=1) 

(df.assign(one=a[:,0], two=a[:,1])   # one and two can be changed
   .drop_duplicates(['one','two'])   # taken from above
   .reindex(df.columns, axis=1)
)

मैं करूँगा

df[~pd.DataFrame(np.sort(df.values,1)).duplicated().values]

पांडा और सुन्न त्रिक से

s=pd.crosstab(df.c1,df.c2)
s=s.mask(np.triu(np.ones(s.shape)).astype(np.bool) & s==0).stack().reset_index()

यदि इसे तेज़ करने की आवश्यकता है, और यदि आपके चर पूर्णांक हैं, तो निम्न चाल मदद कर सकती है: v,w को अपने वेक्टर के कॉलम होने दें; निर्माण [v+w, np.abs(vw)] =: [x, y] ; फिर इस मैट्रिक्स को लेक्सोग्राफिक रूप से क्रमबद्ध करें, डुप्लिकेट निकालें, और अंत में इसे वापस [v, w] = [(x+y), (xy)]/2 मैप करें।







numpy