希望你身体健康!
我正在尝试将下面的数据矩阵转换为二分网络图-其中有两种类型的节点,用户和应用程序。
此外,我希望使用加权边来指示使用频率,并使用值来指示每个应用程序建立的新连接的数量,但就目前而言,任何连接边和节点的简单图形的帮助都会很好!
当前数据帧-
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')我知道我还有很长的路要走,但我只是在努力学习,让事情继续下去。
非常感谢任何帮助,或指出正确的方向!:)
学习资源的链接也很受欢迎:)!
发布于 2020-03-22 00:37:51
假设下面的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')https://stackoverflow.com/questions/60790279
复制相似问题