Python 使用两列之间的映射在dataframe中创建链

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 如果我为初始关系创建一个字典,我将能够创建链的第一个链接,但是我需要循环遍历每

这是一个测试数据帧。我想使用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
如果我为初始关系创建一个字典,我将能够创建链的第一个链接,但是我需要循环遍历每个新列来创建一个新的

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循环,因为您事先不知道有多少层。我添加了我的解决方案。