使用 networkx 创建有向图

Creating a DiGraph using networkx

我有一个这样的 pandas 数据框:

  Name   Project  Start_date

0 Joe    A        01/01/2022
1 Joe    B        03/01/2022
2 Joe    C        07/01/2022
3 Fred   A        01/01/2022
4 Fred   D        05/01/2022
5 Fred   C        08/01/2022

对于每个名称,列表按 Start_date 排序。我想使用 networkx 创建有向图,其中节点是项目,边用名称标记,节点之间的连接按 Start_date 排序。例如:

A -> 乔-> B -> 乔-> C

我考虑使用类似的东西:

projects = df['Project'].to_list()
nx.read_adjlist(projects, create_using=nx.DiGraph)

但我似乎无法让它工作。

您可以尝试以下操作(df 您的数据框):

df.Start_date = pd.to_datetime(df.Start_date)  # Just to make sure
df = df.sort_values("Start_date")
df["Next_Project"] = df.groupby("Name").Project.shift(-1)

这会设置使用 nx.from_pandas_edgelist() 的数据框:

   Name Project Start_date Next_Project
0   Joe       A 2022-01-01            B
1   Joe       B 2022-03-01            C
2   Joe       C 2022-07-01          NaN
3  Fred       A 2022-01-01            B
4  Fred       B 2022-04-01            D
5  Fred       D 2022-05-01            C
6  Fred       C 2022-08-01          NaN

然后读入一个nx.MultiDiGraph,因为节点可以有多个边(我调整了你的例子来添加这样的情况):

import networkx as nx

G = nx.from_pandas_edgelist(
    df[df.Next_Project.notna()],
    source="Project", target="Next_Project", edge_attr="Name",
    create_using=nx.MultiDiGraph,
    edge_key="Name"
)

边和节点:

OutMultiEdgeView([('A', 'B', 'Joe'), ('A', 'B', 'Fred'), ('B', 'C', 'Joe'), ('B', 'D', 'Fred'), ('D', 'C', 'Fred')])
NodeView(('A', 'B', 'C', 'D'))