基于id匹配将df2指定列值更新至df1对应列
基于ID匹配更新Pandas DataFrame的指定列
问题背景
现有两个Pandas DataFrame:df1和df2,数据如下:
df1原始数据
| id | Group | Family | Bonus |
|---|---|---|---|
| 1 | tri23_1 | Laavin | A |
| 2 | hsgç_T2 | Grendy | B |
| 3 | bbbj-1Y_jn | Fantol | C |
| 4 | hsgç_T2 | Gondow | D |
df2原始数据
| id | Group | Family | Bonus |
|---|---|---|---|
| 1 | tri | Brendy | B |
| 2 | hsgç_T2 | Fantol | A |
| 5 | bbbj-1Y_jn | Fantol | E |
| 6 | hsgç_T3 | Gondow | D |
需求:当df1中的id在df2中存在时,将df2对应的Group、Family、Bonus列值覆盖到df1的对应列,最终得到如下结果:
预期更新后的df1
| id | Group | Family | Bonus |
|---|---|---|---|
| 1 | tri | Brendy | B |
| 2 | hsgç_T2 | Fantol | A |
| 3 | bbbj-1Y_jn | Fantol | C |
| 4 | hsgç_T2 | Gondow | D |
解决方案
方法一:使用merge + update(推荐,适合大数据量)
利用Pandas的update方法,通过索引匹配实现高效更新:
import pandas as pd # 构造原始DataFrame df1 = pd.DataFrame({ 'id': [1, 2, 3, 4], 'Group': ['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2'], 'Family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'], 'Bonus': ['A', 'B', 'C', 'D'] }) df2 = pd.DataFrame({ 'id': [1, 2, 5, 6], 'Group': ['tri', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T3'], 'Family': ['Brendy', 'Fantol', 'Fantol', 'Gondow'], 'Bonus': ['B', 'A', 'E', 'D'] }) # 筛选df2中存在于df1的id,提取需要更新的列并设置id为索引 update_source = df2[df2['id'].isin(df1['id'])].set_index('id')[['Group', 'Family', 'Bonus']] # 将df1设置为id索引,执行更新后恢复原索引 df1 = df1.set_index('id') df1.update(update_source) df1 = df1.reset_index() # 输出结果 print(df1)
说明:update方法会自动匹配相同索引的行,仅用非空值覆盖目标DataFrame,不会修改df1中不存在于df2的行。
方法二:使用loc直接定位赋值(直观,适合小数据量)
通过遍历需要更新的行,直接定位df1的对应行进行赋值:
import pandas as pd # 构造原始DataFrame(同方法一) df1 = pd.DataFrame({ 'id': [1, 2, 3, 4], 'Group': ['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2'], 'Family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'], 'Bonus': ['A', 'B', 'C', 'D'] }) df2 = pd.DataFrame({ 'id': [1, 2, 5, 6], 'Group': ['tri', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T3'], 'Family': ['Brendy', 'Fantol', 'Fantol', 'Gondow'], 'Bonus': ['B', 'A', 'E', 'D'] }) # 遍历df2中需要更新到df1的行 for _, row in df2[df2['id'].isin(df1['id'])].iterrows(): # 定位df1中对应id的行,更新指定列 df1.loc[df1['id'] == row['id'], ['Group', 'Family', 'Bonus']] = row[['Group', 'Family', 'Bonus']] # 输出结果 print(df1)
说明:这种方式逻辑清晰,容易理解,但遍历行的效率较低,适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

