Python 将ID与数据帧上的名称匹配
我有一个包含3列的数据框:ID、BossID和Name。每一行都有一个唯一的ID和相应的名称。BossID是该行中人员的上司的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']}) 在这里,安妮是本的老板,本·科是凯特和丹
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