I have a pandas dataframe df
which looks as follows:
From To
0 Node1 Node2
1 Node1 Node3
2 Node2 Node4
3 Node2 Node5
4 Node3 Node6
5 Node3 Node7
6 Node4 Node8
7 Node5 Node9
8 Node6 Node10
9 Node7 Node11
df.to_dict()
is:
{'From': {0: 'Node1',
1: 'Node1',
2: 'Node2',
3: 'Node2',
4: 'Node3',
5: 'Node3',
6: 'Node4',
7: 'Node5',
8: 'Node6',
9: 'Node7'},
'To': {0: 'Node2',
1: 'Node3',
2: 'Node4',
3: 'Node5',
4: 'Node6',
5: 'Node7',
6: 'Node8',
7: 'Node9',
8: 'Node10',
9: 'Node11'}}
I have plotted this pandas dataframe as a network graph using networkx package which looks as follows:
I want to get the list of unique scenarios/branches from this network graph. There are four branches here starting from Node1.
Node1-Node2-Node4-Node8
Node1-Node2-Node5-Node9
Node1-Node3-Node6-Node10
Node1-Node3-Node7-Node11
How can I get the list of the branches above from the given pandas dataframe in Python?
CodePudding user response:
You can define Recursive Function
and save path and print path:
df = pd.DataFrame({
'From':['Node1','Node1', 'Node2', 'Node2', 'Node3', 'Node3', 'Node4', 'Node5', 'Node6', 'Node7'],
'TO' :['Node2','Node3', 'Node4', 'Node5', 'Node6', 'Node7', 'Node8', 'Node9', 'Node10', 'Node11']
})
def prntPath(lst, node, df, lst_vst):
for val in df.values:
if val[0] == node:
lst.append(val[1])
prntPath(lst, val[1], df, lst_vst)
if not lst[-1] in lst_vst:
print('-'.join(lst))
for l in lst: lst_vst.add(l)
lst.pop()
return
lst_vst = set()
prntPath(['Node1'],'Node1', df, lst_vst)
Output:
Node1-Node2-Node4-Node8
Node1-Node2-Node5-Node9
Node1-Node3-Node6-Node10
Node1-Node3-Node7-Node11
You can check and use for other graph like below:
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
from itertools import chain
from networkx.drawing.nx_pydot import graphviz_layout
def prntPath(lst, node, df, lst_vst):
for val in df.values:
if val[0] == node:
lst.append(val[1])
prntPath(lst, val[1], df, lst_vst)
if not lst[-1] in lst_vst: print('-'.join(lst))
for l in lst: lst_vst.add(l)
lst.pop()
return
df = pd.DataFrame({
'From':['Node1','Node1', 'Node2', 'Node3', 'Node3', 'Node5', 'Node7'],
'TO' :['Node2','Node3', 'Node5', 'Node6', 'Node7', 'Node9', 'Node11']
})
g = nx.DiGraph()
g.add_nodes_from(set(chain.from_iterable(df.values)))
for edg in df.values:
g.add_edge(*edg)
pos = graphviz_layout(g, prog="dot")
nx.draw(g, pos,with_labels=True, node_shape='s')
plt.draw()
plt.show()
lst_vst = set()
prntPath(['Node1'],'Node1', df, lst_vst)
Output:
Node1-Node2-Node5-Node9
Node1-Node3-Node6
Node1-Node3-Node7-Node11