Преобразование кадра данных Pd в 2-режимный / двудольный график сети x - PullRequest
1 голос
/ 21 марта 2020

надеюсь, что вы здоровы!

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

Кроме того, я хотел бы иметь взвешенные ребра, чтобы указать частоту использования, и значения, указывающие количество новых соединений, выполненных с каждым приложением, но на данный момент, любая помощь только с простым графом, соединяющим ребра и узлы, будет будь великолепен!

Текущий фрейм данных -

df.head(10)
Out[20]: 
  Unnamed: 0  Airbnb  Peerby  ...  Marktplaats  Together  Snappcar
0      James       1       1  ...            0         1         0
1     Andrew       1       0  ...            0         0         1
2      Sarah       1       0  ...            0         1         0
3       Nick       0       1  ...            1         0         1
4       Mary       0       0  ...            0         0         0
5      Julia       1       1  ...            1         0         1
6      Steve       0       0  ...            0         1         1
7       Mike       1       0  ...            1         0         1 

[8 rows x 9 columns]

Сейчас я ухожу от этого, но не уверен, как заполнить соответствующий источник и цель или как это работает с графиком с двумя типы узлов -


import networkx as nx
import matplotlib.pyplot as plt 
import pandas as pd


#Importing data

df = pd.read_csv("P2P Trial 1.csv")



edges = pd.DataFrame({'source' : [],
                      'target' : [],
                      'weight' : []})

nodes = pd.DataFrame({'node' : [''],
                      'name' : [''],
                      'Apps' : ['']})

G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight')

Я знаю, что мне еще далеко, но я просто пытаюсь научиться и начать работать.

Любая помощь или указывает правильное направление очень ценится! :)

Ссылки на учебные ресурсы также приветствуются :)!

1 Ответ

0 голосов
/ 21 марта 2020

Предполагая следующий DataFrame (пример вашего, обратите внимание, что первый столбец Безымянный):

  Unnamed  Airbnb  Peerby  Marktplaats  Together  Snappcar
0   James       1       1            0         1         0
1  Andrew       1       0            0         0         1
2   Sarah       1       0            0         1         0
3    Nick       0       1            1         0         1
4    Mary       0       0            0         0         0
5   Julia       1       1            1         0         1
6   Steve       0       0            0         1         1
7    Mike       1       0            1         0         1

Вы можете сделать следующее:

# the trick is to use melt to transform the graph into (source, target) format
result = df.melt(id_vars='Unnamed')

# only select columns with 1
filtered = result[result['value'] == 1].rename(columns={'Unnamed': 'source', 'variable': 'target'})

G = nx.from_pandas_edgelist(filtered)

for edge in G.edges:
    print(edge)

Вывод

('James', 'Airbnb')
('James', 'Peerby')
('James', 'Together')
('Airbnb', 'Andrew')
('Airbnb', 'Sarah')
('Airbnb', 'Julia')
('Airbnb', 'Mike')
('Andrew', 'Snappcar')
('Sarah', 'Together')
('Julia', 'Peerby')
('Julia', 'Marktplaats')
('Julia', 'Snappcar')
('Mike', 'Marktplaats')
('Mike', 'Snappcar')
('Peerby', 'Nick')
('Nick', 'Marktplaats')
('Nick', 'Snappcar')
('Together', 'Steve')
('Steve', 'Snappcar')
...