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

How to check if a node is linked to another one?

我有一个通过从外部来源提取数据构建的数据集。输出是这样的

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

等等

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

我的预期输出是

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

为了正确创建网络。

(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')])