csv 到 networkx:每一行作为一个节点,每一列作为边
csv to networkx: each row as one node, each column as edge
我想根据存储在 CSV 文件中的数据使用 networkx 和 matplotlib 可视化网络。 CSV 文件中的数据由 15 列和大约 150 行组成。 csv 文件中的数据类似于下面的玩具示例。索引列由名称列表组成。每个名称都应该是一个节点。每个列名代表一个组织。 “x”表示此人是该组织的成员。目标是将两个人之间的所有直接关系显示为边缘 - 关系越多,视觉中的节点就越大。感谢您的帮助!
作为文本:
(a)
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
...
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')
fig, ax = plt.subplots(figsize=(10,8))
nx.draw_networkx(G, ax=ax)
输出:
我想根据存储在 CSV 文件中的数据使用 networkx 和 matplotlib 可视化网络。 CSV 文件中的数据由 15 列和大约 150 行组成。 csv 文件中的数据类似于下面的玩具示例。索引列由名称列表组成。每个名称都应该是一个节点。每个列名代表一个组织。 “x”表示此人是该组织的成员。目标是将两个人之间的所有直接关系显示为边缘 - 关系越多,视觉中的节点就越大。感谢您的帮助!
作为文本:
(a)
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
...
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')
fig, ax = plt.subplots(figsize=(10,8))
nx.draw_networkx(G, ax=ax)
输出: