在熊猫中建立层次结构

时间:2020-03-13 14:25:38

标签: python pandas

我正在寻找建立谁向谁报告的层次结构,并为每条记录创建报告结构。

我的原始数据包括两列: e_id和s_id:

,我想创建一个包含如下结构的字典变量。列表的最左边的值将爬升层次结构,而字典键为记录e_id值。

e_id    s_id    structure
 1                  {1:[null]}
 2        3       {2:[2,3]} circular so infinite sequence
 3        2       {3:[3,2]} circular so infinite sequence
 4        6       {4:[null,1,6]}
 5        4       {5:[null,1,6,4]}
 6        1       {6:[null,1]}

根据我的理解,这将是一个apply方法,我只是对如何设置它以读取其他行并返回该行的s_id值感到困惑。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

使用networkx图可能会有更好的方法。但这是一个简单的解决方案。

df = pd.DataFrame({'e_id': [1,2,3,4,5,6],
                   's_id': [None,3,2,6,4,1]})

与父母和孩子一起创建字典

parents = dict(zip(df.e_id, df.s_id))

该函数将为每个通过的父级获取一个孩子,然后递归直到出现循环情况或达到无

def find_child(x,i):
    if i==0:
        child_list.clear()
    child = parents.get(x)
    if child not in child_list:
        child_list.append(child)
    else:
        return child_list
    if pd.isnull(child)==False:
        find_child(child,1)
        return child_list

遍历df行,并为每个e_id应用该函数。第二个参数是在进行递归调用时是否清除列表之间进行区分

child_list = []
for idx, row in df.iterrows():
    print({row['e_id']:  find_child(row['e_id'], 0)})

输出:

{1.0: None}
{2.0: [3.0, 2.0]}
{3.0: [2.0, 3.0]}
{4.0: [6.0, 1.0, nan]}
{5.0: [4.0, 6.0, 1.0, nan]}
{6.0: [1.0, nan]}