【问题标题】:How to get Employee --> Manager without separate tables (pandas or SQL)?如何在没有单独的表(熊猫或 SQL)的情况下获得员工 --> 经理?
【发布时间】:2015-08-03 21:19:16
【问题描述】:

是否有简单的代码在 pandas 中执行此操作?或者我应该试试 SQL(我对 SQL 不是很熟悉)。这是我目前所拥有的(假的例子,真实的有大约 20,000 个人)

employee_df =

    EmpID   Name    Title   ManagerID
    abc123   John   Head    pqr456
    pqr456   Jake   VP      bs92999
    zyx987   Jill   Lead    abc123
    bs92999  Bob    SVP     NaN

复制数据框: manager_df = employee_df

roster = pd.merge(manager_df, employee_df, how='outer', left_on ='ManagerID', right_on = 'EmpID')

我的输出很混乱,虽然看起来是正确的(它告诉我经理是谁,而没有通过引用自己的单独表格)。

    EmpID_x Name_x  Title_x ManagerID_x  EmpID_y Name_y Title_y ManagerID_y
    abc123  John    Head      pqr456    pqr456   Jake       VP          bs92999
    pqr456  Jake    VP        bs92999   bs92999  Bob        SVP         NaN
    zyx987  Jill    Lead      abc123    abc123   John       Head        pqr456
    bs92999 Bob     SVP       NaN       NaN      NaN        NaN        NaN
    NaN     NaN     NaN       NaN       zyx987   Jill       Lead        abc123

最常见的期望输出是:

EmpID | Name | Title | Manager_Name

但有时我也需要另一个级别(老板的老板),最大潜力约为 5 层,这看起来很疯狂,但有很多等级 - 并不是一直都需要这么高的层,但我如果需要,希望能够将此数据提升到更高的级别:

EmpID | Name | Title | Manager_Name_1 | Manager_Name_2

第三个数据框是reporting_df:

EmpID | ManagerID | StartDate | EndDate

有时甚至会在月中发生管理变化,结果应该反映在当日“拥有”该员工的经理身上。

file = 任何具有 EmpID 的文件或报告,我可能想在其中找出经理(或其经理)在该日期的身份,该日期也包含在文件中。这是解决这个问题的正确方法吗?

for i in range(len(file)):  
        file.ix[i,'Manager'] = reporting_df[(reporting_df.StartDate.shift(-1) > file.StartDate[i]) &(reporting_df.StartDate <= file.Date[i])]

【问题讨论】:

    标签: python sql database sqlite pandas


    【解决方案1】:

    您可以在 pandas 中使 join 使用合并功能

    x = new_df2[['EmpID', 'ManagerID', 'Name']].merge(new_df2[['EmpID', 'ManagerID', 'Name']],
                                                left_on='ReportsTo', right_on='EmployeeID', how='left')
    x[['EmpID_x', 'Name_x', 'Name_y']].sort_values(by='Name_y') # sort by manager name
    
    x.rename(columns={"Name_x": "Employee_Name", "Name_y": "Manager_Name"}, inplace=True)
    
    

    【讨论】:

      【解决方案2】:

      这在某些方面可能有点棘手,所以让我们逐步构建它。首先,让我们稍微重命名这些列,以便以后更容易(只需将“_0”添加到其中的三个列):

           EmpID Name_0 Title_0 ManagerID_0
      0   abc123   John    Head      pqr456
      1   pqr456   Jake      VP     bs92999
      2   zyx987   Jill    Lead      abc123
      3  bs92999    Bob     SVP         NaN
      

      这里的主要技巧是我们需要一个映射,这可以通过一系列来完成:

      df.set_index('EmpID')['Name_0']
      

      关键是我们将“EmpID”设置为索引,然后为我们提供从“EmpID”到“Name_0”的映射,我们可以对“Title_0”和“ManagerID_0”进行同样的操作。

      尝试一列:

      df['ManagerID_0'].map( df.set_index('EmpID')['Name_0'] )
      
      0    Jake
      1     Bob
      2    John
      3     NaN
      

      现在只需包含一个“for”即可获得完整版本:

      for i in range(3):
          for col in ['Name_','Title_','ManagerID_']:
              df[col+str(i+1)] = df['ManagerID_'+str(i)].map( 
                                                  df.set_index('EmpID')[col+'0'] )
      
           EmpID Name_0 Title_0 ManagerID_0 Name_1 Title_1 ManagerID_1 Name_2    
      0   abc123   John    Head      pqr456   Jake      VP     bs92999    Bob   
      1   pqr456   Jake      VP     bs92999    Bob     SVP         NaN    NaN   
      2   zyx987   Jill    Lead      abc123   John    Head      pqr456   Jake   
      3  bs92999    Bob     SVP         NaN    NaN     NaN         NaN    NaN   
      
        Title_2 ManagerID_2 Name_3 Title_3 ManagerID_3  
      0     SVP         NaN    NaN     NaN         NaN  
      1     NaN         NaN    NaN     NaN         NaN  
      2      VP     bs92999    Bob     SVP         NaN  
      3     NaN         NaN    NaN     NaN         NaN  
      

      我将范围设置为 3,因为每个人的 NaN 都有“ManagerID_3”,但如果您有更多级别,当然可以设置更高。

      【讨论】:

      • 效果很好。这应该比永久存储这些列更有效。您对如何跟踪管理变化有什么建议吗?我想它是 EmpID |经理ID |开始日期 | EndDate 作为一个单独的表,然后以某种方式将其加入回来?就像如果我看一个员工,他在一月份的表现应该在杰克之下,但在 2 月 15 日它切换到鲍勃?
      • 对不起,我不太明白问题的最后一部分。我建议专门提出一个新问题,特别是提供一些示例数据。提供样本数据和所需结果越具体,您就会得到更好的答案。
      猜你喜欢
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多