Python 使用两列之间的映射在dataframe中创建链
这是一个测试数据帧。我想使用EmpID和MgrID之间的关系在新列中进一步映射MgrID的管理器Python 使用两列之间的映射在dataframe中创建链,python,pandas,dataframe,Python,Pandas,Dataframe,这是一个测试数据帧。我想使用EmpID和MgrID之间的关系在新列中进一步映射MgrID的管理器 Test_df = pd.DataFrame({'EmpID':['1','2','3','4','5','6','7','8','9','10'], 'MgrID':['4','4','4','6','8','8','10','10','10','12']}) Test_df 如果我为初始关系创建一个字典,我将能够创建链的第一个链接,但是我需要循环遍历每
Test_df = pd.DataFrame({'EmpID':['1','2','3','4','5','6','7','8','9','10'],
'MgrID':['4','4','4','6','8','8','10','10','10','12']})
Test_df
如果我为初始关系创建一个字典,我将能够创建链的第一个链接,但是我需要循环遍历每个新列来创建一个新的
ID_Dict = {'1':'4',
'2':'4',
'3':'4',
'4':'6',
'5':'8',
'6':'8',
'7':'10',
'8':'10',
'9':'10',
'10':'12'}
Test_df['MgrID_L2'] = Test_df['MgrID'].map(ID_Dict)
Test_df
最有效的方法是什么?
谢谢大家! 这里有一个简单的while循环。注:我将
MgrID
的名称更改为MgrID\u 1
Test_df = pd.DataFrame({'EmpID':['1','2','3','4','5','6','7','8','9','10'],
'MgrID_1':['4','4','4','6','8','8','10','10','10','12']})
d = Test_df.set_index('EmpID').MgrID_1.to_dict()
s = 2
while s:
Test_df['MgrID_'+str(s)] = Test_df['MgrID_'+str(s-1)].map(d)
if Test_df['MgrID_'+str(s)].isnull().all():
Test_df = Test_df.drop(columns='MgrID_'+str(s))
s = 0
else:
s+=1
输出:Test\u df
EmpID MgrID_1 MgrID_2 MgrID_3 MgrID_4 MgrID_5
0 1 4 6 8 10 12
1 2 4 6 8 10 12
2 3 4 6 8 10 12
3 4 6 8 10 12 NaN
4 5 8 10 12 NaN NaN
5 6 8 10 12 NaN NaN
6 7 10 12 NaN NaN NaN
7 8 10 12 NaN NaN NaN
8 9 10 12 NaN NaN NaN
9 10 12 NaN NaN NaN NaN
使用
.map
循环不会那么糟糕。但是如果你想要更复杂的东西,这个问题可以通过有向图来解决,从每个节点找到最长的路径。您将如何通过列编写循环,以便ID从一列传递到另一列?我现在在这里有一个类似python的代码:“IDChain=Employee[['YEAR\u DISPLAY','EmpID','Mgr\u ID']]IDChain['SID\u L2']=IDChain['SID\u L3']=IDChain['SID\u L2'].map(empservisoryddct)IDChain['SID\u L4']=IDChain['SID\u L3'].map(empservisoryddict)IDChain['SID\u L5']=IDChain['SID\u\u'IDChain.]['SID_L6']=IDChain['SID_L5'].map(empservisoryddict)IDChain['SID_L7']=IDChain['SID_L6'].map(empservisoryddict)IDChain'在这种情况下,我想您需要一个while循环,因为您事先不知道有多少层。我添加了我的解决方案。