首页 > 解决方案 > 以三角形方式遍历 Pandas 数据框行

问题描述

我有一个像这样的 Pandas 数据框df

    col1.      col2
0.  value11    List1
1.  value12    List2
2.  value13.   List3
..  ...        ...
i.  value1i.   List_i
j.  value1j.   List_j
..  ...        ...

Col1 是关键(它不重复)。Col2 是一个列表。最后,我想要 Col2 的每一行的集合交集。

我想以三角形方式遍历这个数据框。

类似于以下内容:

 for i = 0 ; i < len(df); i++
     for j = i+1 ; j < len(df) ; j++
         Set(List_i).intersect(Set(List_j)

因此,第一个迭代器遍历整个数据帧,而第二个迭代器从比第一个迭代器更大的索引开始,直到数据帧结束。

如何有效且快速地做到这一点?

编辑:

这样做的幼稚方法是:

col1_list = list(set(df.col1))
num_col1_entries = len(col1_list)
for idx, value1 in enumerate(col1_list):
    for j in range(idx + 1, num_col1_entries):
       value2 = col1_list[j]
       list1 = df.loc[df.col1 == value1]['col2']
       list2 = df.loc[df.col2 == value2]['col2']
       print(set(list1).intersection(set(list2)))

预期输出:每对 col2 行的集合交集的 n(n-1)/2 次打印。

标签: python-3.xpandas

解决方案


您可以使用itertools. 假设这是您的数据框:

    col1.   col2
0   value11 List1
1   value12 List2
2   value13 List3
3   value14 List4
4   value15 List5
5   value16 List6

然后得到所有组合 (15) 并打印两个列表之间的交集:

from itertools import combinations

for pair in list(combinations(df.index, 2)):
    print(pair)
    list1 = df.iloc[pair[0],1]
    list2 = df.iloc[pair[1],1]
    print(set(list1).intersection(set(list2)))

输出(仅打印该对):

(0, 1)
(0, 2)
(0, 3)
(0, 4)
(0, 5)
(1, 2)
(1, 3)
(1, 4)
(1, 5)
(2, 3)
(2, 4)
(2, 5)
(3, 4)
(3, 5)
(4, 5)

推荐阅读