python - 如何基于节点之间的其他边有条件地在网络中创建边(使用 python Networkx 包)?
问题描述
我有一个数据集显示父子关系,但没有兄弟姐妹的子子关系。我正在使用 python 的 Networkx 包(python 版本 3.6)构建网络。我想在兄弟姐妹之间添加边(如果孩子共享父母,他们是兄弟姐妹)。我怎样才能做到这一点?
我发现了一些关于条件边创建的问题,但在这些问题中,条件不依赖于其他节点属性(例如,某些节点的现有边):
但我不确定如何在我的情况下制定条件,以实现我想要的。
import networkx as nx
dat = {'child':[1,1,4,4,5,5,8,8], 'parent':[2,3,2,3,6,7,6,7]}
# Create DataFrame
data = pd.DataFrame(dat)
# Create graph with known connections
G = nx.Graph()
def create_edges(row):
return G.add_edge(row['child'],row['parent'])
data.apply(create_edges, axis=1)
我想在节点 1 和 4 以及节点 5 和 8 之间创建边(因为它们共享父节点并且显然是兄弟姐妹),但不在 1 和 5 或 4 和 8 之间。
解决方案
我希望我不会让事情变得过于复杂,但这就是我的做法:
首先,按共同父母对孩子进行分组。结果变量parents_children
是以dict
父母为键,每个父母的孩子作为值的集合。
parents_children = {parent: {child for child in dat['child']
if (parent,child) in list(zip(dat['parent'],dat['child']))}
for parent in dat['parent']}
之后,遍历具有相同父母的孩子对,并在他们之间添加一条边:
from itertools import combinations
for children in parents_children.values():
for children_couple in combinations(children,2):
G.add_edge(*children_couple)
我在我这边运行它,我认为它得到了正确的结果。
推荐阅读
- clojure - 什么是 Clojure 内在函数
- python - 如何在 R 中格式化和加载 4D 数组?
- node.js - 如何使用自签名证书建立与节点服务器的安全 websocket 连接?
- python - 如何按顺序打印 z3 求解器结果 print(s.model())?
- react-native - 在 React Native 中禁用 WebView 的垂直滚动
- google-cloud-platform - BigQuery - 在哪里可以找到错误流?
- vba - 使用 VBA 自动填充
- java - Azure 存储服务 REST API:创建租约
- html - 将 Bootstrap 4 按钮与 Angular 6 中页面的其他内容对齐
- javascript - 将已关闭的 google Doc 转换为 PDF 并附加到电子邮件中