猿问

将 ID 与 pandas DataFrame 上的名称相匹配

我有一个包含 3 列的 DataFrame: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']})

所以在这里,Anne 是 Ben 的老板,Ben Coe 是 Cate 和 Dan 的老板,等等。


现在,我想要另一个列,其中包含每个人老板的名字。


期望的输出是:


    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 循环来获得输出。有没有更干净的方法来获得所需的输出?


扬帆大鱼
浏览 138回答 3
3回答

温温酱

这应该有效:bossmap = df.set_index('id')['name'].squeeze() df['boss_name'] = df['bossId'].map(bossmap)

守着星空守着你

您可以设置id为索引,然后使用pd.Series.reindexdf = df.set_index('id')df['boss_name'] = df['name'].reindex(df['bossId']).to_numpy() # or .to_list()  id  bossId      name boss_name0   1     NaN  Anne Boe       NaN1   2     1.0   Ben Coe  Anne Boe2   3     2.0  Cate Doe   Ben Coe3   4     2.0   Dan Ewe   Ben Coe4   5     3.0  Erin Aoi  Cate Doe

蝴蝶不菲

'name'为和创建一个单独的数据框'id'。重命名'name'并设置'id'为索引.merge df使用新的数据框import pandas as pd# test dataframedf = 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 namenames = df[['id', 'name']].dropna().set_index('id').rename(columns={'name': 'boss_name'})# merge the twodf = df.merge(names, left_on='bossId', right_index=True, how='left')# df   id  bossId      name boss_name0   1     NaN  Anne Boe       NaN1   2     1.0   Ben Coe  Anne Boe2   3     2.0  Cate Doe   Ben Coe3   4     2.0   Dan Ewe   Ben Coe4   5     3.0  Erin Aoi  Cate Doe
随时随地看视频慕课网APP

相关分类

Python
我要回答