回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个目录树设置如下。顶层由父级_id=-1定义(在本例中,我在顶层有两个节点(即线性资源和点资源)</p>
<pre><code>asset_tree = [
{'id': 1, 'name': 'Linear Asset', 'parent_id': -1},
{'id': 2, 'name': 'Lateral', 'parent_id': 1},
{'id': 3, 'name': 'Main', 'parent_id': 1},
{'id': 4, 'name': 'Point Asset', 'parent_id': -1},
{'id': 5, 'name': 'Fountain', 'parent_id': 4},
{'id': 6, 'name': 'Hydrant', 'parent_id': 4}
]
</code></pre>
<p>我还有一个资产数据框架,定义如下:</p>
<pre><code>import pandas as pd
df = pd.DataFrame({
'name': ['pipe_1','pipe_2','pipe_3','hydrant_1', 'hydrant_2', 'fountain_1', 'fountain_2'],
'level_1': ['Linear Asset','Linear Asset','Linear Asset','Point Asset','Point Asset','Point Asset','Point Asset'],
'level_2': ['Main','Lateral','Lateral','Hydrant','Hydrant','Fountain','Fountain']
})
</code></pre>
<p>因此,数据帧如下所示:</p>
<pre><code> name level_1 level_2
0 pipe_1 Linear Asset Main
1 pipe_2 Linear Asset Lateral
2 pipe_3 Linear Asset Lateral
3 hydrant_1 Point Asset Hydrant
4 hydrant_2 Point Asset Hydrant
5 fountain_1 Point Asset Fountain
6 fountain_2 Point Asset Fountain
</code></pre>
<p>我想要一个函数来查找树的最低级别的id(在示例中为level_2)。对于我的示例代码,我的dataframe输出如下。此外,如果我有1、2或3个级别,我希望该函数可以工作</p>
<pre><code> name level_1 level_2 tree_id
0 pipe_1 Linear Asset Main 3
1 pipe_2 Linear Asset Lateral 2
2 pipe_3 Linear Asset Lateral 2
3 hydrant_1 Point Asset Hydrant 6
4 hydrant_2 Point Asset Hydrant 6
5 fountain_1 Point Asset Fountain 5
6 fountain_2 Point Asset Fountain 5
</code></pre>
<p>我想到了以下功能,但有几个问题:</p>
<ul>
<li>它不起作用(它给我的是级别1 id,而不是级别2)</li>
<li>理想情况下,如果我有三个级别(即级别_1、级别_2和级别_3),而不是只有两个,那么它将使用更复杂的树</li>
</ul>
<pre><code>def find_tree_id(branches, tree):
tree_id = None
number_of_branches = len(branches)
parent_id = -99
for i in range(0,number_of_branches):
for j in range(0,len(tree)):
if i == 0 and branches[i] == tree[j]['name']:
parent_id = tree[j]['parent_id']
tree_id = tree[j]['id']
if parent_id == -1:
return tree_id
return tree_id
tree_ids = []
for i, row in df.iterrows():
tree_id = find_tree_id([row['level_1'], row['level_2']], asset_tree)
tree_ids.append(tree_id)
df['tree_id'] = tree_ids
print(df)
</code></pre>
<p>错误输出为:</p>
<pre><code> name level_1 level_2 tree_id
0 pipe_1 Linear Asset Main 1
1 pipe_2 Linear Asset Lateral 1
2 pipe_3 Linear Asset Lateral 1
3 hydrant_1 Point Asset Hydrant 4
4 hydrant_2 Point Asset Hydrant 4
5 fountain_1 Point Asset Fountain 4
6 fountain_2 Point Asset Fountain 4
</code></pre>