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

2024-06-02 10:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含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循环获得输出。是否有更干净的方法来获得所需的输出


Tags: 数据name名称idnan老板bendan
3条回答
  • 'name''id'创建单独的数据帧。
    • 重命名'name'并将'id'设置为索引
  • ^{}df使用新数据帧
import pandas as pd

# test dataframe
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']})

# separate dataframe with id and name
names = df[['id', 'name']].dropna().set_index('id').rename(columns={'name': 'boss_name'})

# merge the two
df = df.merge(names, left_on='bossId', right_index=True, how='left')

# df
   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

这应该起作用:

bossmap = df.set_index('id')['name'].squeeze()
df['boss_name'] = df['bossId'].map(bossmap)

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

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

相关问题 更多 >