У меня есть pandas фрейм данных, который содержит список больших членов семьи.
import pandas as pd
data = {'child':['Joe','Anna','Anna','Steffani','Bob','Rea','Dani','Dani','Selma','John','Kevin'],
'parents':['Steffani','Bob','Steffani','Dani','Selma','Anna','Selma','John','Kevin','-','Robert'],
}
df = pd.DataFrame(data)
Из этого фрейма данных мне нужно построить новую таблицу, добавив несколько столбцов справа, которые показывают отношения между данными. Значение в правом столбце показывает старшее отношение. Каждый столбец представляет отношение. Если я смогу нарисовать диаграмму, она может выглядеть так:
child --> parents --> grandparents --> parents of grandparents --> grandparents of grandparents --> etc.
Итак, ожидаемый вывод данных будет выглядеть следующим образом:
child parents A B C D (etc)
---------------------------------------------------------------------------------
0 Joe Steffani Dani Selma Kevin <If still possible>
1 Joe Steffani Dani John -
2 Anna Bob Selma Kevin Robert
3 Anna Steffani Dani Selma Kevin
4 Anna Steffani Dani John -
5 Steffani Dani Selma Kevin Robert
6 Steffani Dani John - -
7 Bob Selma Kevin Robert -
8 Rea Anna Bob Selma Kevin
9 Rea Anna Steffani Dani Selma
10 Rea Anna Steffani Dani John
11 Dani Selma Kevin Robert -
12 Dani John - - -
13 Selma Kevin Robert - -
14 John - - - -
15 Kevin Robert - - -
В настоящее время я создаю новый таблица вручную, используя pandas.merge
. Но мне нужно делать это много раз до последнего столбца, который не имеет отношения старшего с левым столбцом. Например:
Шаг 1
df2 = pd.merge(df, df, left_on='parents', right_on='child', how='left').fillna('-')
df2 = df2[['child_x','parents_x','parents_y']]
df2.columns = ['child','parents','A']
Шаг 2
df3 = pd.merge(df2, df, left_on='A', right_on='child', how='left').fillna('-')
df3 = df3[['child_x','parents_x','A','parents_y']]
df3.columns = ['child','parents','A','B']
Шаг 3
df4 = pd.merge(df3, df, left_on='B', right_on='child', how='left').fillna('-')
df4 = df4[['child_x','parents_x','A','B','parents_y']]
df4.columns = [['child','parents','A','B','C']]
Шаг 4
Напишите аналогичный код, чтобы добавить 6-й столбец для столбца D, если значение в столбце C все еще имеет отношение старшего.
Проблема:
Поскольку у меня большие данные в кадре данных (более 10 Кбайт точек данных), как решить эту проблему без пошагового написания кода? Я не знаю, сколько шагов мне нужно, чтобы составить финальный стол.
Заранее благодарен за любую помощь.