繁体   English   中英

csv to.networkx:每一行为一个节点,每一列为边

[英]csv to networkx: each row as one node, each column as edge

我想从存储在 CSV 文件中的数据中可视化 a.network with.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)

Output:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM