Python 将ID与数据帧上的名称匹配

Python 将ID与数据帧上的名称匹配,python,pandas,Python,Pandas,我有一个包含3列的数据框:ID、BossID和Name。每一行都有一个唯一的ID和相应的名称。BossID是该行中人员的上司的ID。假设我有以下数据帧: df = pd.DataFrame({'id':[1,2,3,4,5], 'bossId':[np.nan, 1, 2, 2, 3], 'name':['Anne Boe','Ben Coe','Cate Doe','Dan Ewe','Erin Aoi']}) 在这里,安妮是本的老板,本·科是凯特和丹

我有一个包含3列的数据框:ID、BossID和Name。每一行都有一个唯一的ID和相应的名称。BossID是该行中人员的上司的ID。假设我有以下数据帧:

df = pd.DataFrame({'id':[1,2,3,4,5], 'bossId':[np.nan, 1, 2, 2, 3], 
                   'name':['Anne Boe','Ben Coe','Cate Doe','Dan Ewe','Erin Aoi']})
在这里,安妮是本的老板,本·科是凯特和丹的老板,等等

现在,我想有另一个专栏,每个人都有老板的名字

所需输出为:

    id  boss    name    boss_name
0   1   NaN     Anne    NaN
1   2   1.0     Ben     Anne
2   3   2.0     Cate    Ben
3   4   2.0     Dan     Ben
4   5   3.0     Erin    Cate
我可以使用难看的双for循环获得输出。有没有更干净的方法来获得所需的输出?

这应该可以:

bossmap = df.set_index('id')['name'].squeeze()
df['boss_name'] = df['bossId'].map(bossmap)
  • 'name'
    'id'
    创建单独的数据框。
    • 重命名
      'name'
      ,并将
      'id'
      设置为索引
  • df
    使用新数据帧
将熊猫作为pd导入
#测试数据帧
df=pd.DataFrame({'id':[1,2,3,4,5],'bossId':[np.nan,1,2,2,3],'name':['Anne Boe','Ben Coe','Cate Doe','Dan Ewe','Erin Aoi']))
#使用id和名称分隔数据帧
names=df[['id','name'].dropna().set_index('id').rename(列={'name':'boss_name'})
#合并两者
df=df.merge(name,left_on='bossId',right_index=True,how='left')
#df
id bossId名称boss\U名称
01楠安妮·博楠
1 2 1.0本·科·安妮·波
2.3 2.0 Cate Doe Ben Coe
3 4 2.0丹·埃维·本·科
4.5.3.0艾琳Aoi Cate Doe

您可以将
id
设置为索引,然后使用


您的代码在不使用
.squeeze()
的情况下运行良好
bossmap
与带或不带
的答案相同。挤压
这两个答案都有效,但对于本例,rhug的解决方案更好。
df = df.set_index('id')
df['boss_name'] = df['name'].reindex(df['bossId']).to_numpy() # or .to_list()

  id  bossId      name boss_name
0   1     NaN  Anne Boe       NaN
1   2     1.0   Ben Coe  Anne Boe
2   3     2.0  Cate Doe   Ben Coe
3   4     2.0   Dan Ewe   Ben Coe
4   5     3.0  Erin Aoi  Cate Doe