#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных pandas, который выглядит следующим образом:
id | folder | level0_parent_id | level1_parent_id | level2_parent_id | level3_parent_id
1 A 0 0 0 0
2 B 1 0 0 0
3 C 1 2 0 0
4 D 1 2 0 0
5 E 1 2 4 0
Я хочу вернуть структуру папок для каждой строки в отдельном столбце, например
- строка 1: A — корень, родительского элемента нет, все идентификаторы равны 0 = A
- строка 2: B находится под A, id = 1, поэтому путь равен A / B
- строка 3: C находится под идентификатором A = 1 для level0 и под B = 2 для level1, в результате чего = A / B / C
- строка 4: D находится под идентификатором A = 1 для level0 и под B = 2 для level1, в результате чего = A / B / D
- строка 5: E находится под идентификатором A = 1 для level0 и под B = 2 для level1 и под D = 4 для уровня 2, в результате = A / B / D / E
и это продолжается и продолжается, у меня может быть несколько корней, означающих level0 = 0, и если уровень 0 не равен 0, это означает, что это не Root, поэтому он связан с Root …(я думаю, это очевидно)
Как я могу сделать это с Pandas?
Ответ №1:
Один подход с melt
df['structure'] = df['folder'].map(
df.melt(['id', 'folder'], var_name='level')
.assign(child=lambda x: x['value'].map(dict(zip(df['id'], df['folder'])))
.fillna(x['folder']))
.drop_duplicates(['folder', 'child'])
.groupby('folder')['child'].agg('/'.join)
)
print(df)
Вывод
id folder level0_parent_id level1_parent_id level2_parent_id
0 1 A 0 0 0
1 2 B 1 0 0
2 3 C 1 2 0
3 4 D 1 2 0
4 5 E 1 2 4
level3_parent_id structure
0 0 A
1 0 A/B
2 0 A/B/C
3 0 A/B/D
4 0 A/B/D/E