【问题标题】:How to create a set of sets effectively in Python?如何在 Python 中有效地创建一组集合?
【发布时间】:2020-11-17 12:05:40
【问题描述】:

我有两个数据框两个数据框,有两列。这些行是值对,其中顺序并不重要:对我来说 a-b == b-a。我需要在两个数据帧之间比较这些值对。 我有一个解决方案,但是对于 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}} 等

【问题讨论】:

    标签: python pandas row unique


    【解决方案1】:

    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})}
    

    【讨论】:

    • 这些看起来也很复杂,我不拘泥于套路,只是我想不到还有什么,谢谢你的回答
    • @biohazard90 - 嗯,性能怎么样?第二个 - 我认为您的 11 rows solution 仅 2 rows 解决方案更简单。
    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多