我不确定如何解决我的问题,因此我无法查看它是否已经存在(提前道歉)

Group    Item
 A         1
 A         2
 A         3
 B         1
 B         3
 C         1
 D         2
 D         3

我想知道共享超过 X 个项目的组的所有组合(在本例中为 2)。我想知道他们共享哪些项目。

结果 :
A-B: 2 (item 1 and item 3)
A-D: 2 (item 2 and item 3)

组和项目的列表真的很长,跨组的项目匹配的最大数量可能不超过 3-5。

注意 超过 2 个组可以共享项目 - 例如A-B-E:3
因此,一次仅比较两组是不够的。我需要比较所有组的组合。

我的想法
  • 第一轮:所有组的一堆 - 是否至少有两个值是共享的?
  • 第二轮:All-1 组(所有组合)
  • 第三轮:All-2 组(所有组合)

  • 直到我达到只有两个组(所有组合)之间的比较。
    然而,这在性能方面似乎非常重要!!我不知道如何做到这一点。

    你的想法是什么?

    谢谢!

    最佳答案

    除非您有其他信息来限制搜索,否则我只会处理唯一组集合的所有子集(大小 >= 2)。

    对于每个子集,我将搜索属于该集合所有成员的项目:

    a = df['Group'].unique()
    for cols in chain(*(combinations(a, i) for i in range(2, len(a) + 1))):
        vals = df['Item'].unique()
        for col in cols:
            vals = df.loc[(df.Group==col)&(df.Item.isin(vals)), 'Item'].unique()
        if len(vals) > 0: print(cols, vals)
    

    它给:
    ('A', 'B') [1 3]
    ('A', 'C') [1]
    ('A', 'D') [2 3]
    ('B', 'C') [1]
    ('B', 'D') [3]
    ('A', 'B', 'C') [1]
    ('A', 'B', 'D') [3]
    

    关于python - 部分交叉 - 多个组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58057897/

    10-12 19:17