Группировка всех связанных узлов набора данных - PullRequest
1 голос
/ 20 июня 2019

Это не дубликат:

Самый быстрый способ выполнить сложный поиск на фрейме данных панд

Примечание: pandas ver 0.23.4

Допущения: данные могут быть расположены в любом порядке.

У меня есть список:

L = ['A', 'B', 'C', 'D', 'L', 'M', 'N', 'O']

У меня также есть фрейм данных.У Col1 и Col2 есть несколько связанных столбцов, которые имеют связанную информацию, которую я хочу сохранить.Информация произвольна, поэтому я не заполнил ее.

Col1  Col2  Col1Info  Col2Info  Col1moreInfo  Col2moreInfo
 A     B       x         x            x             x
 B     C
 D     C
 L     M
 M     N
 N     O

Я пытаюсь выполнить «поиск и группировку» для каждого элемента списка.Например, если мы выполним поиск по элементу списка 'D', будет возвращена следующая группа:

To    From  Col1Info  Col2Info  Col1moreInfo  Col2moreInfo
 A     B       x         x            x             x
 B     C
 D     C

Я играл с networkx, но это очень сложный пакет.

1 Ответ

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

Вы можете определить график, используя значения из обоих столбцов в качестве ребер, и искать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...