В этом ответе я предполагаю, что ваш прямой родитель всегда находится в ряду выше вашего, так как это то, что вы ожидаете и ваша диаграмма предполагает.
С этой гипотезой мы можем для каждой строки взять ближайшую строку с уровнем ниже строки:
import pandas as pd
data={"Symbol":["A", "A01", "A01B", "A01B 1/00", "A01B 1/02", "A01B 1/022", "B"], "level":[2,4,5,7,8,9,2]}
df=pd.DataFrame(data=data)
df['Parent'] = ''
for index, row in df.iterrows():
# We look at the potential parents
potential_parents = df.loc[df.index.isin([x for x in range(index)]) & (df['level'] < row['level']), 'Symbol']
# And we take the last one as our parent
if len(potential_parents) == 0:
df.loc[index, 'Parent'] = ''
else:
df.loc[index, 'Parent'] = potential_parents.iloc[-1]
Выход:
Symbol level Parent
0 A 2
1 A01 4 A
2 A01B 5 A01
3 A01B 1/00 7 A01B
4 A01B 1/02 8 A01B 1/00
5 A01B 1/022 9 A01B 1/02
6 B 2