Python 如何获得员工-->;没有单独表的管理器(pandas或SQL)?

Python 如何获得员工-->;没有单独表的管理器(pandas或SQL)?,python,sql,database,sqlite,pandas,Python,Sql,Database,Sqlite,Pandas,是否有一个简单的代码来实现这一点?或者我应该试试SQL(我不太熟悉SQL)。以下是我到目前为止的情况(假例子,真实的例子大约有20000人) 雇员= EmpID Name Title ManagerID abc123 John Head pqr456 pqr456 Jake VP bs92999 zyx987 Jill Lead abc123 bs92999 Bob SVP NaN

是否有一个简单的代码来实现这一点?或者我应该试试SQL(我不太熟悉SQL)。以下是我到目前为止的情况(假例子,真实的例子大约有20000人)

雇员=

    EmpID   Name    Title   ManagerID
    abc123   John   Head    pqr456
    pqr456   Jake   VP      bs92999
    zyx987   Jill   Lead    abc123
    bs92999  Bob    SVP     NaN
复制数据帧: 经理=员工

roster = pd.merge(manager_df, employee_df, how='outer', left_on ='ManagerID', right_on = 'EmpID')
我的输出是混乱的,尽管看起来是正确的(它告诉我谁是经理,而不需要通过引用它自己单独的表)

最常见的期望输出是:

EmpID | Name | Title | Manager_Name
但有时我也需要另一个级别(老板的老板),最大可能有大约5层,这似乎很疯狂,但有很多层次结构-这样的高层并非总是必要的,但如果需要,我希望能够将这些数据上卷到更高的级别:

EmpID | Name | Title | Manager_Name_1 | Manager_Name_2
第三个数据帧报告_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])]
范围内i的
(len(文件)):

file.ix[i,'Manager']=reporting_-df[(reporting_-df.StartDate.shift(-1)>file.StartDate[i])&(reporting_-df.StartDate这在某些方面可能有点棘手,所以让我们分步骤构建它。首先,让我们稍微重命名这些列,以便以后更容易(只需在其中三列中添加“_0”):

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

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”,但如果你有更多级别,当然可以设置得更高。

你可以在pandas中使用join-use-merge函数

x=new_-df2[['EmpID','ManagerID','Name']]。合并(new_-df2[['EmpID','ManagerID','Name']],
左上为“ReportsTo”,右上为“EmployeeID”,左上为“how=”
x['EmpID_x'、'Name_x'、'Name_y']]。按管理器名称对值进行排序
x、 重命名(列={“Name_x”:“Employee_Name”,“Name_y”:“Manager_Name”},inplace=True)

效果很好。这应该比永久存储这些列更有效。你对如何跟踪管理变化有什么建议吗?我想它是EmpID | ManagerID | StartDate | EndDate作为一个单独的表,然后以某种方式加入它?比如,如果我看一个员工,他一月份的表现应该在Jake之下,但是在2月15日,它切换到了Bob?很抱歉,我没有完全理解问题的最后一部分。我建议专门问一个新问题,特别是提供一些样本数据。提供样本数据和期望的结果越具体,你会得到更好的答案。
df['ManagerID_0'].map( df.set_index('EmpID')['Name_0'] )

0    Jake
1     Bob
2    John
3     NaN
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