Python 如何获得员工-->;没有单独表的管理器(pandas或SQL)?
是否有一个简单的代码来实现这一点?或者我应该试试SQL(我不太熟悉SQL)。以下是我到目前为止的情况(假例子,真实的例子大约有20000人) 雇员=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
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