Объединение Pandas с родительскими идентификаторами в том же фрейме данных

#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