Вы можете определить график, используя значения из обоих столбцов в качестве ребер, и искать connected_components
.Вот способ использования NetworkX
:
import networkx as nx
G=nx.Graph()
G.add_edges_from(df.values.tolist())
cc = list(nx.connected_components(G))
# [{'A', 'B', 'C', 'D'}, {'L', 'M', 'N', 'O'}]
Теперь скажем, например, что вы хотите фильтровать по D
, затем вы можете сделать:
component = next(i for i in cc if 'B' in i)
# {'A', 'B', 'C', 'D'}
И индексировать кадр данных, гдезначения из обоих столбцов находятся в component
:
df[df.isin(component).all(1)]
Col1 Col2
0 A B
1 B C
2 D C
Вышеизложенное можно распространить на все элементы в списке, создав список кадров данных.Тогда нам просто нужно проиндексировать, используя позицию, в которой данный элемент присутствует в L
:
L = ['A', 'B', 'C', 'D', 'L', 'M', 'N', 'O']
dfs = [df[df.isin(i).all(1)] for j in L for i in cc if j in i]
print(dfs[L.index('D')])
Col1 Col2
0 A B
1 B C
2 D C
print(dfs[L.index('L')])
Col1 Col2
3 L M
4 M N
5 N O