【问题标题】:Python pandas dataframe populate hierarchical levels from parent childPython pandas 数据框从父子级填充层次结构
【发布时间】:2022-05-03 18:27:37
【问题描述】:

我有以下包含父子关系的数据框:

data = pd.DataFrame({'Parent':['a','a','b','c','c','f','q','z','k'],
                      Child':['b','c','d','f','g','h','k','q','w']})
a
├── b
│   └── d
└── c
    ├── f
    │   └── h
    └── g
z
└── q
    └── k
        └── w

我想获得一个新的数据框,其中包含例如父母a的所有孩子:

child level1 level2 level x
d a b -
b a - -
c a - -
f a c -
h a c f
g a c -

我不知道前面有多少级别,因此我使用了“级别 x”。

我想我需要一个递归模式迭代数据帧。

【问题讨论】:

  • 根据您与数据框的字典一起发布的代码行,如何知道'd''b' 的孩子?我在您的图表中看到了它,但是您拥有或正在输入的数据如何显示这种关系?啊,nvm我现在看到了-第一个父母是第一个孩子的父母,第二个父母是第二个孩子的父母,等等。所以d是第四个孩子,第四个父母的孩子也是如此跨度>

标签: python pandas recursion


【解决方案1】:

我建议

  • 构建每个children:parentList
  • 构建DataFrame 并为每个父级指定一个level 名称
import pandas as pd

values = {'Parent': ['a', 'a', 'b', 'c', 'c', 'f', 'q', 'z', 'k'],
          'Child': ['b', 'c', 'd', 'f', 'g', 'h', 'k', 'q', 'w']}

relations = dict(zip(values['Child'], values['Parent']))

def get_parent_list(element):
    parent = relations.get(element)
    return get_parent_list(parent) + [parent] if parent else []

all_relations = {
    children: {f'level_{idx}': value for idx, value in enumerate(get_parent_list(children))}
    for children in set(values['Child'])
}

df = pd.DataFrame.from_dict(all_relations, orient='index')
print(df)


  level_0 level_1 level_2
b       a     NaN     NaN
f       a       c     NaN
d       a       b     NaN
g       a       c     NaN
h       a       c       f
q       z     NaN     NaN
k       z       q     NaN
w       z       q       k
c       a     NaN     NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2017-03-12
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多