Как networkx обрабатывает 2 кортежа? - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь построить сеть, в которой мои ребра состоят из кортежей. Я пытаюсь сгруппировать все связанные элементы, но только на основе одного элемента в кортеже.

Аналогично: Группировка всех связанных узлов набора данных

Примечание: Панды 23,4

С учетом следующего кадра данных:

  col1     col2     col1Name       col2Name
  'A'       'B'      '12345'        '78911'
  'C'       'B'      '12345'        '78911'
  'J'       'K'      '12345'        '12345'
  'E'       'D'      '12345'        '12345'

Я объединяю col1 и col1Name в кортеж и делаю то же самое с col2 / col2Name.

      col1                col2    
  ('A','12345')       ('B','78911')   
  ('C','12345')       ('B','78911') 
  ('J','12345')       ('K','12345')
  ('E','12345')       ('D','12345')
  ('X','99999')       ('B','99999') 

Отсюда я пытаюсь найти всю «связанную» информацию, но не в отношении второго элемента кортежа, только первого.

Так что, если бы я сгруппировал информацию, она бы выглядела следующим образом:

      col1                col2    
  ('A','12345')       ('B','78911')   
  ('C','12345')       ('B','78911') 
      col1                col2
  ('J','12345')       ('K','12345')
      col1                col2
  ('E','12345')       ('D','12345')
      col1                col2
  ('X','99999')       ('B','99999') 

Обратите внимание, что группы не учитывают col1Name / col2Name, что бы ни было. Эта информация существует только для того, чтобы придать элементам col1 / col2 больше «уникальности». Также стоит отметить, что возможно иметь несколько A, B, C и т. Д. В моем примере ('B','78911') не совпадает с ('B','99999')

Мое мышление (из ссылки):

G.add_edges_from(df.values.tolist())
cc = list(nx.connected_components(G))
component = next(i for i in cc if ('A') in i)
test = df[df.isin(component).all(1)]

Возвращает все группы, связанные с «A», но также и группы, связанные с «12345», «78911». Я пытаюсь сгруппировать только по первому элементу.

1 Ответ

0 голосов
/ 28 июня 2019

Вы писали:

Обратите внимание, что в группировках не учитывается col1Name / col2Name вообще.

и:

Однако ('B', '99999') не входит в ту же группу, что и ('B', '78911')

Это противоречит.Чем они отличаются, если вы «не принимаете во внимание col1Name / col2Name»?Также в вашем фрейме данных отсутствует "X".

Так что вы группируете вместе?Вы писали:

('X', '99999') и ('B', '99999') сгруппированы вместе

Но это всего лишь два кортежа втот же ряд.В своем первом посте вы написали, что вы группируете по одинаковым значениям в col1 или равным значениям в col2 по всем строкам.Так что же это?А как выглядят данные в df?Я не могу воспроизвести ваш пример кода.Попытайтесь объяснить более точно, что вы хотите сделать.

Учитывая противоречивую и недостающую информацию, я прошу вас попытаться: «Сгруппировать строки, которые имеют одинаковые значения в col1 или col2».

Если вы получили ваши данные только в виде кортежей (как вы написали), вы потеряете информацию о строках, поэтому я не думаю, что вы это имели в виду.

Поскольку вы описываете сеть с ребрами и (как выписал (а): ваши столбцы col1Name и col2Name должны игнорироваться для группировки, вы должны дать правильные кортежи для метода connected_components().Выглядит так:

l = [('A', 'B'),('C', 'B'),('J', 'K'),('E','D'),('X','B')]

G=nx.Graph()
G.add_edges_from(l)
cc = list(nx.connected_components(G))
component = next(i for i in cc if ('A') in i)

#{'B', 'X', 'C', 'A'}

for x in l:
    if x[0] in component or x[1] in component:
        print (x)

>>> ('A', 'B')
>>> ('C', 'B')
>>> ('X', 'B')

Метод networkX connected_component () группирует все кортежи, которые имеют одно равное значение.Если вы хотите использовать этот метод, вы должны предоставить ему правильные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...