Pandas 中的递归操作

dfu*_*ako 8 python dataframe pandas

我有一个像这样的数据帧:

vals = {"operator": [1, 1, 1, 2, 3, 5], "nextval": [2, 3, 6, 4, 5, 6]}
df = pd.DataFrame(vals)

   operator  nextval
0         1        2
1         1        3
2         1        6
3         2        4
4         3        5
5         5        6
Run Code Online (Sandbox Code Playgroud)

我想要做的是使用运算符和 nextval 获取从起点(如 1)到终点(如 6)的所有可能路径的列表,而不是严格意义上的最短路径。输出可以很灵活,但我正在寻找这样的东西或传达这一点的东西:

1 -> 6
1 -> 2 -> 4 
1 -> 3 -> 5 -> 6
Run Code Online (Sandbox Code Playgroud)

我能够关闭它,但不确定如何正确地进行递归,因为 dict 无法处理 2 个相同的键:

import pandas as pd

vals = {"operator": [1, 1, 1, 2, 3, 5], "nextval": [2, 3, 6, 4, 5, 6]}
df = pd.DataFrame(vals)

df1 = df.set_index("operator")

dictvals = {}
for x in df1.index.unique():
    dictvals[x] = []
    df2 = df1.loc[x]
    if isinstance(df2, pd.DataFrame):
        for idx, rowdata in df2.iterrows():
            dictvals[x].append(rowdata["nextval"])
    else:
        dictvals[x] = df2[0]

print(dictvals) 

{1: [2, 3, 6], 2: 4, 3: 5, 5: 6}
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 4

检查,您需要一个带有to路径networkx的方向图'root''leaf'

import networkx as nx
G=nx.from_pandas_edgelist(df,source='operator',target='nextval', edge_attr=None, create_using=nx.DiGraph())
road=[]
for n in G:
       if G.out_degree(n)==0: #leaf
           road.append(nx.shortest_path(G, 1, n))
           
road
Out[82]: [[1, 2, 4], [1, 3, 5, 6]]
Run Code Online (Sandbox Code Playgroud)

更新

import networkx as nx
G=nx.from_pandas_edgelist(df,source='operator',target='nextval', edge_attr=None, create_using=nx.DiGraph())
road=[]
for n in G:
       if G.out_degree(n)==0: #leaf
           road.append(list(nx.all_simple_paths(G, 1, n)))
           
road
Out[509]: [[[1, 3, 5, 6], [1, 6]], [[1, 2, 4]]]
Run Code Online (Sandbox Code Playgroud)