【问题标题】:Matching IDs with names on a pandas DataFrame将 ID 与 pandas DataFrame 上的名称匹配
【发布时间】:2020-10-10 19:20:38
【问题描述】:

我有一个包含 3 列的 DataFrame:ID、BossID 和 Name。每一行都有一个唯一的 ID 并有一个相应的名称。 BossID 是该行中人员的老板的 ID。假设我有以下 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']})

所以在这里,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 循环获得输出。有没有更简洁的方法来获得所需的输出?

【问题讨论】:

  • 两个答案都有效,但 rhug 的解决方案更适合这个例子。

标签: python pandas


【解决方案1】:

这应该可行:

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

【讨论】:

  • 您的代码可以在不使用.squeeze() 的情况下正常工作。 bossmap.squeeze 相同或没有.squeeze
【解决方案2】:

您可以将id设置为索引,然后使用pd.Series.reindex

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

【讨论】:

    【解决方案3】:
    • 'name''id' 创建一个单独的数据框。
      • 重命名'name'并将'id'设置为索引
    • .merge 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多