与熊猫建立亲子关系

时间:2020-04-02 13:27:17

标签: python pandas

我是熊猫的新手,正在寻找一种使用pandas或python简化多级父子关系的方法。我有一个csv文件,其中包含如下数据。

对于每个孩子,我想从父母到孩子遍历。任何帮助都将受到赞赏。

输入

--------------------
Child,Parent,Country
--------------------
A,TOP LEVEL,GERMANY

B,A,USA

C,B,JAPAN

D,TOP LEVEL,INDIA

E,D,CHINA

输出

--------------------
HIERARCHY,COUNTRY
--------------------
A,GERMANY

A.B,USA

A.B.C,JAPAN

D,INDIA

D.E,CHINA

1 个答案:

答案 0 :(得分:0)

可以使用networkx和有向图来完成此操作,以防在原始DataFrame中不一定正确排序的情况。首先,我们需要修复DataFrame,以使TOP LEVEL不是父级,并且使用国家/地区。

import pandas as pd
import networkx as nx

df['True_Parent'] = df['Parent'].mask(df['Parent'].eq('TOP LEVEL')).fillna(df['Country'])
#  Child     Parent  Country True_Parent
#0     A  TOP LEVEL  GERMANY     GERMANY
#1     B          A      USA           A
#2     C          B    JAPAN           B
#3     D  TOP LEVEL    INDIA       INDIA
#4     E          D    CHINA           D

现在创建有向图

G = nx.from_pandas_edgelist(df, source='True_Parent', target='Child', 
                            create_using=nx.DiGraph())

我们想要的都是递归的所有前辈:

def all_preds(G, target):
    preds=[target]
    for p in list(G.predecessors(target)):
        preds += all_preds(G, p)
    return preds

df['Hierarchy'] = ['.'.join(all_preds(G, country)[:-1][::-1]) for country in df['Child'].unique()]
#  Child     Parent  Country True_Parent Hierarchy
#0     A  TOP LEVEL  GERMANY     GERMANY         A
#1     B          A      USA           A       A.B
#2     C          B    JAPAN           B     A.B.C
#3     D  TOP LEVEL    INDIA       INDIA         D
#4     E          D    CHINA           D       D.E

拥有这样的关系有点奇怪。在第一组中,您有最高级别,A,B,C,但只有3个独特的国家/地区。如果您想创建更简洁的父子映射,我们可以在制作图表之前做到这一点:

(df.groupby(df.Parent.eq('TOP LEVEL').cumsum())
   .apply(lambda gp: gp.replace(gp.set_index('Child').Country.to_dict()))
   .query('Parent != "TOP LEVEL"')[['Child', 'Parent']])

#   Child   Parent
#1    USA  GERMANY
#2  JAPAN      USA
#4  CHINA    INDIA