使用 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'))
我有一个这样的 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'))