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)

输出: