首页 > 解决方案 > 使用 pandas 定义部门层次结构

问题描述

给定以下结构:

data1 = {
        'emp': [1, 2, 3, 4, 5, 6, 7, 8, 9],
        'dep': [100, 500, 200, 100, 200, 300, 400, 300, 200],
        'boss': [6, 7, 6, 6, 6, 7, None, 7, 6]}

df1 = pd.DataFrame(data1, columns = ['emp', 'dep', 'boss'])

数据来自平面 CSV 文件。现在我必须在部门之间建立层次结构。规则如下:

预期的结果是这样的:

   dep  parent  boss
0  100   300.0     6
1  500   400.0     7
2  200   300.0     6
3  300   400.0     7
4  400     NaN     7

有没有什么熊猫技巧可以解决这个问题?我可以通过读取 CSV 文件并使用 dicts 以迭代的方式实现这一点,但我的目标是用 pandas 解决这个问题。任何的想法?

编辑: 示例数据中存在错误。Emp 8 当然和 emp 6 有相同的老板。

标签: pythonpandashierarchy

解决方案


您可以将 df1 与自身合并以找到当前老板的部门,然后仅保留相关列并删除重复项。要使其工作,boss 栏必须填写 emp 栏,才能最终拥有上级部门的老板。

在 Pandas 中,它可能是:

df2 = df1[['boss', 'dep']].assign(boss=df1['boss'].combine_first(
    df1['emp'])).merge(df1[['emp', 'dep']].rename(
    columns={'dep': 'parent'}), how='left', left_on='boss', right_on='emp'
)[['dep', 'parent', 'boss']].drop_duplicates().astype('int')
def2.loc[df2['parent'] == df2['dep'], 'parent'] = np.nan   # a dep cannot be its parent

正如预期的那样:

   dep  parent  boss
0  100   300.0     6
1  500   400.0     7
2  200   300.0     6
5  300   400.0     7
6  400     NaN     7

推荐阅读