будет несколько разных способов сделать это - вот уродливое решение.
Мы используем цикл while и for для функции "back-level" каждого столбца кадра данных: для этого требуется, чтобысначала мы устанавливаем id в качестве индекса и сортируем по уровню по убыванию.Это также не требует дублирования идентификаторов.Вот так:
df = df.set_index('id')
df = df.sort_values(by='level', ascending=False)
for i in df.index:
while df.loc[i, 'level'] > 1:
old_pid = df.loc[i, 'parent_id']
df.loc[i, 'parent_id'] = df.loc[old_pid, 'parent_id']
old_level = df.loc[i,'level']
df.loc[i, 'level'] = old_level - 1
Таким образом, независимо от того, сколько существует уровней, мы остаемся со всем на уровне 1 иерархии и можем затем сделать:
grouped = df.groupby('parent_id').mean()
(или любой другойвариация того что нужно) надеюсь это поможет!