Идентификация конечных родителей в панде - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующий фрейм данных со столбцом Child и столбцом Parents:

import pandas as pd
df = pd.DataFrame({'Child': ['A1', 'A2', 'A3', 'A1', 'A1', 'A4', 'A2', 'A3'],
               'Parent': ['B1', 'B2', 'A2', 'B3', 'A4', 'B4', 'B5', 'B6']})

df

  Child Parent
0    A1     B1
1    A2     B2
2    A3     A2
3    A1     B3
4    A1     A4
5    A4     B4
6    A2     B5
7    A3     B6

Есть дубликаты children, и некоторые из них появляются в столбце parent.Я хотел бы знать конечных родителей.Этот вопрос похож на этот , но с дубликатами в столбце Child.Вывод, который я хотел бы получить, выглядит примерно так:

  Child                                  Links   Ult_Parents
0    A1       (A1 - B1, A1 - B3, A1 - A4 - B4)  (B1, B3, B4)
1    A2                     (A2 - B2, A2 - B5)      (B2, B5)
2    A3  (A3 - A2 - B2, A3 - A2 - B5, A3 - B6)  (B2, B5, B6)
3    A4                              (A4 - B4)          (B4)

A1 имеет четких родителей B1 и B3, но также и B4, поскольку он связан с A4.А2 имеет просто В2 и В5.Я заинтересован в связях между ними, но в основном о конечных родителях.

1 Ответ

0 голосов
/ 22 ноября 2018
import networkx as nx
def all_descendants_nx():
    DiG = nx.from_pandas_edgelist(df,'Parent','Child',create_using=nx.DiGraph())
    return pd.DataFrame.from_records([(n1,n2) for n1 in DiG.nodes() for n2 in nx.ancestors(DiG, n1)], columns=['Child','Ult_Parents'])

df = all_descendants_nx()
df = df.loc[df.Ult_Parents.str.startswith("B")]
print(df)

df['Links'] = df.Child.astype('str') + ' - ' + df.Ult_Parents.astype('str')
df = df.groupby('Child').agg(lambda x: sorted(x.tolist())).reset_index()
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...