从列中查找所有可能的组合,并组合它们的 pandas 值

Find all possible combinations from a column and also combine their pandas values

我有这样一个数据框:

data = {'col1':[['A'],['B'],['C'],['D']],
       'col2':[['foo1','foo2'],['foo1','bar1'],['bar1'],['bar1','bar2','bar3']]}
df= pd.DataFrame(data)

+----+------------------+
|col1|              col2|
+----+------------------+
| [A]|      [foo1, foo2]|
| [B]|      [foo1, bar1]|
| [C]|            [bar1]|
| [D]|[bar1, bar2, bar3]|
+----+------------------+

我想找到列 col1 的所有列表组合,并合并它们在 col2 中的值。结果,我想得到这样一个数据框:

+----------+----------------------------------+
|comb_col1 |comb_col2                         |
+----------+----------------------------------+
|[[A], [B]]|[[foo1, foo2], [foo1, bar1]]      |
|[[A], [C]]|[[foo1, foo2], [bar1]]            |
|[[A], [D]]|[[foo1, foo2], [bar1, bar2, bar3]]|
|[[B], [C]]|[[foo1, bar1], [bar1]]            |
|[[B], [D]]|[[foo1, bar1], [bar1, bar2, bar3]]|
|[[C], [D]]|[[bar1], [bar1, bar2, bar3]]      |
+----------+----------------------------------+

理想情况下,我想与 combo_sol2 的内部列表相交,并得到这样的结果

+----------+----------------------------------+---------+
|comb_col1 |comb_col2                         |intersect|
+----------+----------------------------------+---------+
|[[A], [B]]|[[foo1, foo2], [foo1, bar1]]      |[foo1]   |
|[[A], [C]]|[[foo1, foo2], [bar1]]            |[]       |
|[[A], [D]]|[[foo1, foo2], [bar1, bar2, bar3]]|[]       |
|[[B], [C]]|[[foo1, bar1], [bar1]]            |[bar1]   |
|[[B], [D]]|[[foo1, bar1], [bar1, bar2, bar3]]|[bar1]   |
|[[C], [D]]|[[bar1], [bar1, bar2, bar3]]      |[bar1]   |
+----------+----------------------------------+---------+
from itertools import combinations

df1=df.apply(lambda x: list(combinations(x, 2)))
df1['intersect']=df1['col2'].apply(lambda x:list(set(x[0]).intersection(x[1])))

df1

         col1                                col2 intersect
0  ([A], [B])        ([foo1, foo2], [foo1, bar1])    [foo1]
1  ([A], [C])              ([foo1, foo2], [bar1])        []
2  ([A], [D])  ([foo1, foo2], [bar1, bar2, bar3])        []
3  ([B], [C])              ([foo1, bar1], [bar1])    [bar1]
4  ([B], [D])  ([foo1, bar1], [bar1, bar2, bar3])    [bar1]
5  ([C], [D])        ([bar1], [bar1, bar2, bar3])    [bar1]