我不确定如何解决我的问题,因此我无法查看它是否已经存在(提前道歉)
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
因此,一次仅比较两组是不够的。我需要比较所有组的组合。
我的想法
直到我达到只有两个组(所有组合)之间的比较。
然而,这在性能方面似乎非常重要!!我不知道如何做到这一点。
你的想法是什么?
谢谢!
最佳答案
除非您有其他信息来限制搜索,否则我只会处理唯一组集合的所有子集(大小 >= 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/