簡體   English   中英

如何在pyhton中有效地創建一組集合?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM