具有具有样本分层数据的Pandas数据帧,即

data = pd.DataFrame({
"manager_id": ["A", "A", "B", "A", "C", "A", "B"],
"employee_id": ["B", "C", "C", "D", "E", "E", "E"]
} )

假设数据由每个经理的所有后代关系组成.例如,在每个经理ID中(例如"A"),员工ID包括这两个员工(例如"B")由经理"A"直接管理,员工"B"管理的员工(例如"C"、"D").在networkx中如何将其表示为有向图?图形的边应该是

[('A', 'B'), ('A', 'D'), ('B', 'C'), ('C', 'E')]

推荐答案

将DataFrame读取为from_pandas_edgelist的有向图,然后对topological_sort的 node 进行排序,只保留每个子 node 具有最大拓Flutter 指数的父 node 的边:

G = nx.from_pandas_edgelist(data, source='manager_id', target='employee_id',
                            create_using=nx.DiGraph)

# topological order
order = {n: i for i,n in enumerate(nx.topological_sort(G))}
# {'A': 0, 'B': 1, 'D': 2, 'C': 3, 'E': 4}

# for each node, only keep the parent that has the greatest topological index
parents = {}
for source, target in G.edges():
    p = parents.setdefault(target, source)
    if order[source] > order[p]:
        parents[target] = source

# parents
# {'C': 'B', 'E': 'C', 'B': 'A', 'D': 'A'}

# remove shorter edges
G.remove_edges_from(G.edges - set(zip(parents.values(), parents.keys())))
# or
# G = G.edge_subgraph(list(zip(parents.values(), parents.keys())))

输出:

networkx remove extra edges with topological sort

过滤前图表:

networkx input graph with duplicated paths

Variant

您还可以计算topological_generations的顺序,以使相同层代的 node 具有相同的编号.

order = {n: i for i, l in enumerate(nx.topological_generations(G)) for n in l}
# {'A': 0, 'B': 1, 'D': 1, 'C': 2, 'E': 3}

在LINK TO your other question中,还可以计算相对世代差,并仅保留两个 node 之间世代差为1的边:

G = nx.from_pandas_edgelist(data, source='manager_id', target='employee_id',
                            create_using=nx.DiGraph)

order = {n: i for i, l in enumerate(nx.topological_generations(G)) for n in l}
# {'A': 0, 'B': 1, 'D': 1, 'C': 2, 'E': 3}

# compute the relative generation difference
# keep the edges with a difference of 1
keep = [e for e in G.edges if order[e[1]]-order[e[0]] == 1]
# [('A', 'B'), ('A', 'D'), ('B', 'C'), ('C', 'E'), ('F', 'G')]

G = G.edge_subgraph(list(zip(parents.values(), parents.keys())))

Python相关问答推荐

Pydantic 2.7.0模型接受字符串日期时间或无

如何比较numPy数组中的两个图像以获取它们不同的像素

输出中带有南的亚麻神经网络

如何找到满足各组口罩条件的第一行?

基于索引值的Pandas DataFrame条件填充

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

如何在Python中获取`Genericums`超级类型?

Django admin Csrf令牌未设置

在matplotlib中删除子图之间的间隙_mosaic

Python Pandas—时间序列—时间戳缺失时间精确在00:00

Numpyro AR(1)均值切换模型抽样不一致性

为什么我的sundaram筛这么低效

如何删除重复的文字翻拍?

Python Mercury离线安装

Pandas:计数器的滚动和,复位

Django抛出重复的键值违反唯一约束错误

使用Scikit的ValueError-了解

如何在Django查询集中生成带有值列表的带注释的字段?

如何将django url参数传递给模板&S url方法?

如何在微调Whisper模型时更改数据集?