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)
检查,您需要一个带有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)
归档时间: |
|
查看次数: |
125 次 |
最近记录: |