<p>这是一个网络问题,请尝试<code>networkx</code>:</p>
<pre><code>import networkx as nx
# build the graph
G = nx.from_pandas_edgelist(tree, source='parent_id', target='id',
create_using=nx.DiGraph)
# map id to name
node_names = tree.set_index('id')['name'].to_dict()
# get path from root (-1) to the node
def get_path(node):
# this is a tree, so exactly one simple path for each node
for path in nx.simple_paths.all_simple_paths(G, -1, node):
return ' : '.join(node_names.get(i) for i in path[1:])
tree['flat_name'] = tree['id'].apply(get_path)
</code></pre>
<p>输出:</p>
<pre><code> id name parent_id flat_name
0 1 Linear Asset -1 Linear Asset
1 2 Lateral 1 Linear Asset : Lateral
2 3 Main 1 Linear Asset : Main
3 4 Point Asset -1 Point Asset
4 5 Fountain 4 Point Asset : Fountain
5 6 Hydrant 4 Point Asset : Hydrant
6 7 Steel 2 Linear Asset : Lateral : Steel
7 8 Plastic 2 Linear Asset : Lateral : Plastic
8 9 Steel 3 Linear Asset : Main : Steel
9 10 Plastic 3 Linear Asset : Main : Plastic
</code></pre>