csv转为networkx:每一行为一个节点,每一列为边缘

0 人关注

我想用networkx和matplotlib将一个存储在CSV文件中的数据可视化。CSV文件中的数据由15列和大约150行组成。csv文件中的数据看起来像下面这个玩具例子。索引列由一个名字的列表组成。每个名字都应该是一个节点。每一列名称代表一个组织。"x "表示这个人是该组织的成员。我们的目标是将两个人之间的所有直接关系显示为一条边--关系越多,视觉上的节点就越大。谢谢你的帮助!

作为文本。

Name Org A Org B Org C Org D Org F ... Person 1 x x x x Person 2 x x Person 3 x Person 4 x Person 5 x x Person 6 Person 7 x x x Person 8 x x Person 9 x Person 10 x x x
2 个评论
你能不能把你的数据列为文本。用图像工作很困难。
谢谢你的提示。这样做是不是更有帮助?
python
pandas
csv
matplotlib
networkx
MountQ
MountQ
发布于 2022-04-24
1 个回答
Scott Boston
Scott Boston
发布于 2022-04-24
已采纳
0 人赞同

IIUC,你想要这样的东西。

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df = pd.DataFrame({'Name':[f'person {f}' for f in range(1,11)],
                   'Org A':['x']+[np.nan]*7+['x']+[np.nan],
                   'Org B':['x']+[np.nan]*3+['x']+[np.nan]+['x']*2+[np.nan]*2,
                   'Org C':['x',np.nan,'x']+[np.nan]*3+['x']+[np.nan]*2+['x'],
                   'Org D':['x', 'x', np.nan, 'x']+[np.nan]*2+['x']+[np.nan]*2+['x'],
                   'Org F':[np.nan]+['x']+[np.nan]*2+['x']+[np.nan]*2+['x']+[np.nan, 'x']})
dfm = df.melt('Name').dropna()
df_net= dfm.merge(dfm, on = 'variable').query('Name_x != Name_y')
G = nx.from_pandas_edgelist(df_net, 'Name_x', 'Name_y')