[英]How to create a set of sets effectively in pyhton?
我有兩個數據框兩個數據框,有兩列。 行是值對,其中順序並不重要:對我來說是 ab == ba。 我需要比較兩個數據幀之間的這些值對。 我有一個解決方案,但是對於 300k 的數據幀來說這非常慢
import pandas as pd
df1 = pd.DataFrame({"col1" : [1,2,3,4], "col2":[2,1,5,6]})
df2 = pd.DataFrame({"col1" : [2,1,3,4], "col2":[1,9,8,9]})
mysets = [{x[0],x[1]} for x in df1.values.tolist()]
df1sets = []
for element in mysets:
if element not in df1sets:
df1sets.append(element)
mysets = [{x[0],x[1]} for x in df2.values.tolist()]
df2sets = []
for element in mysets:
if element not in df2sets:
df2sets.append(element)
intersect_sets = [x for x in df1sets if x in df2sets]
這有效,但速度非常慢,必須有更簡單的方法來做到這一點。 我的一個問題是我不能將一個集合添加到一個集合中,我不能創建 {{1,2}, {2,3}} 等
Pandas 解決方案是與列的排序值合並,刪除重復項並轉換為集合:
intersect_sets = ([set(x) for x in pd.DataFrame(np.sort(df1.to_numpy(), axis=1))
.merge(pd.DataFrame(np.sort(df2.to_numpy(), axis=1)))
.drop_duplicates()
.to_numpy()])
print (intersect_sets)
[{1, 2}]
一組frozensets的另一個想法:
intersect_sets = (set([frozenset(x) for x in df1.to_numpy()]) &
set([frozenset(x) for x in df2.to_numpy()]))
print (intersect_sets)
{frozenset({1, 2})}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.