【问题标题】:Adjacency matrix from pandas dataframe in PythonPython中熊猫数据框的邻接矩阵
【发布时间】:2021-11-03 11:03:56
【问题描述】:

下面是我在 python 中尝试做的一个小例子。 我正在使用网络,我的网络中有 15000 个不同的节点。 数据来自 pandas 数据集:

Node Target  Node_Attrib
mom    dad       0.2
mom    grandmother 0.12
mom    grandfather 0.24
mom    Lucy      0.2
dad    mom       0.4
dad    Lucy      0.3
Lucy   mom       0.1
Lucy   dad       0.3
Lucy   Mark      0.1
Lucy   grandmother 0.2
Lucy   grandfather 0.1

网络创建如下:

G=nx.from_pandas_edgelist(df,’Node’, ‘Target’,[‘Node_Attrib’]

其中 nx 是 networkx。 由于我想进行一些分析,我需要使用邻接矩阵。 我正在考虑使用交叉表来做到这一点:

adj = pd.crosstab(df.Node, df.Target)
idx=adj.columns.union(df.index)
adj=adj.reindex(index=idx,columns=idx,fill_value=0)

我想知道这是否是在 python 中获取邻接矩阵的最佳方法,也是由于网络中节点的数量。 你知道另一种方法可以更好地管理 Python 中的数千个节点(和边)吗?

【问题讨论】:

  • 给定输入的预期输出是什么?
  • 我希望示例中的数据有一个邻接矩阵,以便扩展到我的整个数据集(大约 10000 个节点)。我使用了这种方法,但我不确定它是否可以
  • networkx 与问题有什么关系?你正在做什么样的分析,在当前的图形表示中是做不到的?
  • 我需要 networkx 来显示我的网络。我的问题是 Incan 如何从 pandas 数据框在 python 中创建邻接矩阵。如果 networkx 不是一个合适的标签(尽管我的问题与 python 中的网络和图形有关),请随意删除它
  • 你能澄清一下你的图表是否是定向的吗? (mom, Lucy) 与表中的 (Lucy, mom) 具有不同的值。另外,您是否希望用边的相关"Node_Attrib" 值填充矩阵的值?

标签: python networkx adjacency-matrix


【解决方案1】:

首先,nx.from_pandas_edgelist() 默认会创建一个无向图。这意味着它首先将边 (mom, Lucy) 的值设置为 0.2,因为这是您的表中第一次遇到该边。但是当你解析(Lucy, mom)时,相同的边会被更新为新的值。

>>> G.get_edge_data('mom', 'Lucy')
{'Node_Attrib': 0.1}

对于有向图,将线改为

G = nx.from_pandas_edgelist(df, 'Node', 'Target', ['Node_Attrib'], create_using=nx.DiGraph())

Networkx 具有函数nx.adjacency_matrix(),它创建一个 scipy 稀疏矩阵。当并非所有边都有值时,这对于节省内存很有用。

>>> adj = nx.adjacency_matrix(G, weight='Node_Attrib')
>>> adj[0,1]    # (mom, dad) edge as the node ordering is taken from `G.nodes`
0.2
>>> array = adj.todense()   # if for some reason you need the whole matrix

正如该函数的文档所述,您还可以使用 dict-of-dicts 创建一个与稀疏矩阵等效的纯 Python。但是如果你想进行一些分析,我怀疑上面的数组选项会更适合你。

>>> adj = nx.convert.to_dict_of_dicts(G)
>>> adj['mom']['Lucy']['Node_Attrib']
0.2

这需要进行一些清理,以便adj[node1][node2] 直接为您提供边缘值。您还需要将它与adj.get(node1, {}).get(node2, 0.) 一起实际使用,以免遇到任何KeyError

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2021-10-02
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多