python-3.x - 以三角形方式遍历 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 次打印。
解决方案
您可以使用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)
推荐阅读
- javascript - Angular父组件“作用域”子组件
- excel - 根据过滤器更改数据透视表中的平均公式
- r - Mac 无法设置 wd:error in cannot change in working directory
- javascript - 反应:搜索过滤器无法正常工作
- spring-boot - 如何在 Spring Boot 响应控制中删除 Object 的某些字段?
- akka-stream - 使用 Alpakka 的无限 AMQP 消费者
- python - 向 json 字典 python 添加新的键/值
- node.js - 如何在没有 create-react-app 的情况下手动配置 React 的最小设置?
- php - Laravel:下载一个新的 excel 文件
- git - 创建新分支不会为 IntelliJ 中的所有模块创建分支