Python 使用pandas定义部门层次结构

Python 使用pandas定义部门层次结构,python,pandas,hierarchy,Python,Pandas,Hierarchy,鉴于以下结构: 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文件。 现在我

鉴于以下结构:

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文件。 现在我必须在各部门之间建立等级制度。 规则如下:

  • 每个员工都在一个部门工作
  • 员工可能有老板(CEO没有老板)
  • 老板工作的部门是给定员工的上级部门
  • 上级部门没有父部门
预期结果如下:

   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以迭代的方式来实现这一点,但我的目标是用熊猫解决这个问题。 有什么想法吗

编辑:
样本数据中有一个错误。Emp 8当然与Emp 6具有相同的boss。

您可以将df1与其自身合并以找到当前boss的部门,然后只保留相关列并删除重复项。为了让it工作,boss列必须填写emp列,以便最终拥有更高级别部门的boss

在熊猫中,可能是:

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

尝试:df1.merge(df1,left_on='boss',right_on='emp',how='left')[[dep_x','dep_y','boss_x']]但是我不明白你怎么知道dep 400 boss是7,为什么emp 6和emp 8有不同的boss首先,如果你把它放在末尾,解决方案是正确的。删除重复项()以得到一个不同的部门列表。我的错误:emp 8和emp有相同的老板。:-)6.你说得对,还不够清楚。老板必须是经理。如果一个经理没有经理,那么他就是大老板。因此,emp 7是他自己的老板,但dep 400没有家长。这是最高级别(CEO)。因此,它的家长应该是NaN(当然,CEO部门的老板是CEO本人,所以这是正确的)