Как определить списки общих элементов и групповые списки хотя бы с одним общим элементом? - PullRequest
6 голосов
/ 20 июня 2019

У меня есть Dataframe с 1 столбцом (+ индекс), содержащий списки подсписков или элементов.Я хотел бы обнаружить общие элементы в списках / подсписках и сгруппировать списки по крайней мере с одним общим элементом, чтобы иметь только списки элементов без каких-либо общих элементов.Списки / подсписки в настоящее время похожи на это (пример для 4 строк):

                 Num_ID
Row1   [['A1','A2','A3'],['A1','B1','B2','C3','D1']]`

Row2   ['A1','E2','E3']

Row3   [['B4','B5','G4'],['B6','B4']]

Row4   ['B4','C9']

n списков без общих элементов (пример для первых 2):

['A1','A2','A3','B1','B2','C3','D1','E2','E3']
['B4','B5','B6','C9','G4']

1 Ответ

5 голосов
/ 20 июня 2019

Для этого вы можете использовать метод NetworkX connected_components. Вот как я подхожу к этому этому решению:

import networkx as nx
from itertools import combinations, chain

df= pd.DataFrame({'Num_ID':[[['A1','A2','A3'],['A1','B1','B2','C3','D1']], 
                            ['A1','E2','E3'], 
                            [['B4','B5','G4'],['B6','B4']], 
                            ['B4','C9']]})

Начните с выравнивания подсписков в каждом списке:

L = [[*chain.from_iterable(i)] if isinstance(i[0], list) else i 
       for i in df.Num_ID.values.tolist()]

[['A1', 'A2', 'A3', 'A1', 'B1', 'B2', 'C3', 'D1'],
 ['A1', 'E2', 'E3'],
 ['B4', 'B5', 'G4', 'B6', 'B4'],
 ['B4', 'C9']]

Учитывая, что списки / подсписки имеют более 2 элементов, вы можете получить все комбинации длины 2 из каждого подсписка и использовать их в качестве ребер сети (обратите внимание, что ребра могут соединять только два узла):

L2_nested = [list(combinations(l,2)) for l in L]
L2 = list(chain.from_iterable(L2_nested))

Создайте график и добавьте свой список в качестве краев графика, используя add_edges_from. Затем используйте connected_components, который точно даст вам список наборов связанных компонентов на графике:

G=nx.Graph()
G.add_edges_from(L2)
list(nx.connected_components(G))

[{'A1', 'A2', 'A3', 'B1', 'B2', 'C3', 'D1', 'E2', 'E3'},
 {'B4', 'B5', 'B6', 'C9', 'G4'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...