【问题标题】:Efficient way to check if 2 columns of DataFrame are subsets of each other检查DataFrame的2列是否彼此子集的有效方法
【发布时间】:2020-09-16 00:23:43
【问题描述】:

我有 2 个 DataFrame,其中有一列的值是 set 类型,包含 8 位整数。


df1(包含大约 200k 行)

    id  s1
0   0   {43649632, 95799329, 40649644, 23335890, 81779...
1   1   {69900026, 74441229}
2   2   {85195648, 55750338, 98936902, 82000264, 43544...
3   3   {21916700, 13627806}
4   4   {62929026, 38592365, 44179790, 38355127}

df2(包含大约 900k 行)

    id  s1
0   0   {58209736, 25405713, 28691898, 94682562}
1   1   {81089732, 82343077}
2   2   {59692896, 33234306, 40445479, 18728345, 24464...
3   3   {71406042, 69900026, 74441229}
4   4   {62929026}

我想知道从df2df2 中找到符合ONE OF THIS 条件的ids 对的最快方法: p>

  • df1.s1d2.s1 的子集

  • df2.s1d1.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))

有没有更快或更有效的方法来做到这一点?

【问题讨论】:

    标签: python pandas performance loops set


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多