如何基于Name匹配将Table1的ID赋值给Table2的ID列?
问题与解决方法
现有两个DataFrame
Table 1
| ID | Name | Column C | Column D |
|---|---|---|---|
| 1234hj | Bob | 1 | 1 |
| nkj234 | Joe | 2 | 2 |
| ji3251 | Schmoe | 3 | 3 |
Table 2
| ID | Name |
|---|---|
| Bob | |
| Joe | |
| Sam |
需求
当Name字段匹配时,将Table1中的ID提取并设置为Table2的ID。
问题代码
尝试了以下代码但未达到预期:
df2['ID'] = np.where(df['Name'] == df2['Name'], df['Prompt'], df2['ID'])
代码问题分析
- 变量名错误:代码中使用的
df未定义,应对应Table1的df1;同时不存在df['Prompt']字段,实际需要提取的是df1['ID']。 - 匹配逻辑错误:直接逐元素比较
df1['Name'] == df2['Name']会触发广播,无法实现按Name精准匹配的需求。
正确实现方法
方法1:使用字典映射(高效简洁)
先从Table1构建Name到ID的映射关系,再批量匹配Table2的Name字段:
# 从df1创建Name对应ID的字典 name_to_id = df1.set_index('Name')['ID'].to_dict() # 为df2的ID赋值,匹配不到的保留原空值 df2['ID'] = df2['Name'].map(name_to_id).fillna(df2['ID'])
方法2:使用DataFrame合并(适合复杂场景)
通过左连接合并两个表,保留Table2的所有行,匹配对应的ID:
# 仅保留df1中需要的Name和ID字段,左连接到df2 merged_result = df2.merge(df1[['Name', 'ID']], on='Name', how='left', suffixes=('_old', '_new')) # 用匹配到的新ID替换原ID,无匹配的保留原空值 df2['ID'] = merged_result['ID_new'].fillna(merged_result['ID_old'])
内容的提问来源于stack exchange,提问作者Janzen Liu
相关产品推荐
相关产品推荐

