Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查DataFrame的两列是否为彼此的子集的有效方法_Python_Pandas_Performance_Loops_Set - Fatal编程技术网

Python 检查DataFrame的两列是否为彼此的子集的有效方法

Python 检查DataFrame的两列是否为彼此的子集的有效方法,python,pandas,performance,loops,set,Python,Pandas,Performance,Loops,Set,我有两个数据帧,其中有一列的值是包含8位整数的set类型 df1(包含约20万行) df2(包含约900k行) 我想知道从df2和df2中找到匹配此条件之一的id对的最快的方法: df1.s1是d2.s1 或 df2.s1是d1.s1 比如说, df1的id=1是df2的id=3的子集,因此(1,3)是有效对 df2的id=4是df1的id=4的子集,因此(1,4)是有效对 我在下面尝试了此代码,但大约需要20个小时: id_pairs = [] for i in tqdm(

我有两个数据帧,其中有一列的值是包含8位整数的set类型


df1(包含约20万行)


df2(包含约900k行)

我想知道从
df2
df2
中找到匹配此条件之一的
id
对的最快的方法:

  • df1.s1
    d2.s1

  • df2.s1
    d1.s1
比如说,

  • df1的id=1是df2的id=3的子集,因此(1,3)是有效对
  • df2的id=4是df1的id=4的子集,因此(1,4)是有效对

我在下面尝试了此代码,但大约需要20个小时:

id_pairs = []

for i in tqdm(list(df2.itertuples(index=False))):
    for j in df1.itertuples(index=False):
        if i.s1.issubset(j.s1) or j.s1.issubset(i.s1):
            id_pairs.append((i.id, j.id))

有没有更快或更有效的方法来执行此操作?

您可以执行笛卡尔连接,然后应用条件

df1["key"] = 0
df2["key"] = 0

merged = df1.merge(df2, how="outer", on="key")

def subset(row):
    if (row.s1.issubset(row.s2)) or (row.s2.issubset(row.s1)):
        return (row.id1, row.id2)
    else:
        return None

merged.apply(lambda row: subset(row), axis=1).dropna()

可以进行笛卡尔连接,然后应用条件

df1["key"] = 0
df2["key"] = 0

merged = df1.merge(df2, how="outer", on="key")

def subset(row):
    if (row.s1.issubset(row.s2)) or (row.s2.issubset(row.s1)):
        return (row.id1, row.id2)
    else:
        return None

merged.apply(lambda row: subset(row), axis=1).dropna()
df1["key"] = 0
df2["key"] = 0

merged = df1.merge(df2, how="outer", on="key")

def subset(row):
    if (row.s1.issubset(row.s2)) or (row.s2.issubset(row.s1)):
        return (row.id1, row.id2)
    else:
        return None

merged.apply(lambda row: subset(row), axis=1).dropna()