我是熊猫的新手,正在寻找一种使用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
答案 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