python, панды, Как найти связи между каждой группой

#python #networking

Вопрос:

У меня возникли проблемы с поиском соединений между группами на основе связанных данных (может быть, groupby?) для создания сети.

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

Например, мой фрейм данных выглядит следующим образом:

 group_number data 1 a 2 a 2 b 2 c 2 a 3 c 4 a 4 c  

Так что выход был бы

 Source_group Target_group Frequency 2 1 1 (because a-a) 3 2 1 (because c-c) 4 2 2 (because a-a, c-c)  

Конечно (because...) , не будет в выходных данных, просто объяснение

Большое спасибо

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить взаимосвязь между исходным кадром данных и выводом? Что должно быть в столбцах source target и frequency и?

2. Здравствуйте, спасибо за проверку, я пересмотрел свои сообщения: для каждой группы, если в них есть один и тот же элемент, они связаны.

Ответ №1:

Я думал о твоей проблеме. Вы могли бы сделать что-то вроде следующего:

 import pandas as pd from collections import defaultdict  df = pd.DataFrame({'group_number': [1,2,2,2,2,3,4,4],  'data': ['a','a','b','c','a','c','a','c']})  # group the data using multiindex and convert it to dictionary d = defaultdict(dict) for multiindex, group in df.groupby(['group_number', 'data']):  d[multiindex[0]][multiindex[1]] = group.data.size  # iterate groups twice to compare every group  # with every other group relationships = [] for key, val in d.items():  for k, v in d.items():  if key != k:  # get the references to two compared groups  current_row_rel = {}  current_row_rel['Source_group'] = key  current_row_rel['Target_group'] = k  # this is important, but at this point   # you are basically comparing intersection of two   # simple python lists  current_row_rel['Frequency'] = len(set(val).intersection(v))  relationships.append(current_row_rel)  # convert the result to pandas DataFrame for further analysis. df = pd.DataFrame(relationships)  

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