#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)
Я уверен, что это можно было бы сделать без необходимости преобразования в список словарей. Однако я нахожу это решение более простым.