Python 检查DataFrame的两列是否为彼此的子集的有效方法
我有两个数据帧,其中有一列的值是包含8位整数的set类型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(
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()