Объединить несколько строк из одного и того же кадра данных на основе родительского идентификатора - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть фрейм данных, в котором некоторые строки имеют отношения родитель-потомок.Например, 1002 является родителем 1003, 1003 является родителем 1004

    import pandas as pd
    import numpy as np

    df = pd.DataFrame(columns=['Id', 'Parent Id', 'Child Id', 'A', 'B'],
                      data=[[1001, np.nan, 1005, 'A1001', 'B1001'],
                            [1002, np.nan, 1003, 'A1002', 'B1002'],
                            [1003, 1002, 1004, 'A1003', np.nan],
                            [1004, 1003, np.nan, 'A1004', np.nan],
                            [1005, 1001, np.nan, 'A1005', np.nan]
                            ])
    print(df)

         Id  Parent Id  Child Id      A      B
    0  1001        NaN    1005.0  A1001  B1001
    1  1002        NaN    1003.0  A1002  B1002
    2  1003     1002.0    1004.0  A1003    NaN
    3  1004     1003.0       NaN  A1004    NaN
    4  1005     1001.0       NaN  A1005    NaN

Я хочу объединить строки, чтобы сохранить только те строки без дочернего элемента.Я понимаю, что могу сделать это с

    df = df[df['Child Id'].isnull()]

Однако некоторая информация появляется только в родительской строке, но отсутствует в дочерних строках, например, столбец «B» из 1002. Я хочу наследовать ее в последней дочерней строке.

Ниже ожидаемый результат:

        Id  Parent Id  Child Id      A      B
    3  1004     1003.0       NaN  A1004  B1002
    4  1005     1001.0       NaN  A1005  B1001

Вместо итерации строк, есть ли встроенный метод панд, который я могу использовать?

1 Ответ

1 голос
/ 24 сентября 2019

Вам нужно получить значение в столбце B вниз по цепочке родительско-дочерних отношений.Вы можете сделать это с помощью:

for i in range(max_length_of_relationships):
    df = df.merge(df[['Id', 'B']].rename({'Id': 'Parent Id', 'B': 'Parent B'}, axis=1), how='left')
    df['B'] = df['B'].combine_first(df['Parent B'])
    df.drop('Parent B', axis=1, inplace=True)

Где max_length_of_relationships - максимальное количество родительско-дочерних ссылок в одной цепочке (2 в df: 1. 10002-10003, 2.10003-10004), если выНе уверены, что это за число, используйте большое число, которое невозможно превзойти.А затем оставьте только строки без дочерних элементов, как вы сделали с:

df = df[df['Child Id'].isnull()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...