如何检查一个节点是否链接到另一个节点?

2024-06-16 06:12:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从外部源提取数据的数据集。输出如下

Node       Target
Jennifer   Maria
Luke       Mark
Johnny     nan
Ludo       Martin
Maria      nan
Mark       Luke
Mark       Christopher 

等等

当我使用networkx构建网络时,由于我的一些节点的目标字段为空,所以我有孤立的节点,而应该链接到源节点(例如MariaJennifer)。 我正在考虑定向网络,但即使它是无向的,问题仍然会存在,因为当我加载as nodes list the Nodes列时,我会在Target中得到nan值的节点,该节点链接到一个名为nan的节点。 我的问题是:有没有办法检查节点列中的节点是否(至少)有一个链接,查看目标列? 很高兴提供更多信息

我的预期产出是

Node       Target
Jennifer   Maria
Luke       Mark
Johnny     nan
Ludo       Martin
Maria      Jennifer
Mark       Luke
Mark       Christopher 

以便正确创建网络


Tags: 数据网络nodetarget节点链接nanmartin
1条回答
网友
1楼 · 发布于 2024-06-16 06:12:03

(a)查找Target其中NaN值, (b) 从Target中的a查找Node。 (c) 用b中的Node替换NaN 并更新原始数据帧

a = df.loc[df['Target'].isnull()]
b = df[df['Target'].isin(a['Node'])]
b = b.rename(columns={'Node': 'Target', 'Target': 'Node'})
c = pd.merge(a['Node'], b, how='left', on='Node').set_index(a.index)
df.update(c)
>>> a
     Node Target
2  Johnny    NaN
4   Maria    NaN

>>> b
     Target   Node
0  Jennifer  Maria

>>> c
     Node    Target
2  Johnny       NaN
4   Maria  Jennifer

>>> df
       Node       Target
0  Jennifer        Maria
1      Luke         Mark
2    Johnny          NaN  # <- NaN
3      Ludo       Martin
4     Maria     Jennifer  # <- Jennifer
5      Mark         Luke
6      Mark  Christopher

旧答案 按照@AKX的建议,在构建图形之前删除带有NaN的行:

import networkx as nx

edges = df[df.notna().all(1)]

G = nx.from_pandas_edgelist(edges, source='Node', target='Target')
>>> G.edges
EdgeView([('Jennifer', 'Maria'), ('Luke', 'Mark'),
          ('Mark', 'Christopher'), ('Ludo', 'Martin')])

相关问题 更多 >