如何使用Python Pandas通过name列用另一DataFrame的值替换目标DataFrame的值?
问题描述
需要通过name列,用DataFrame df2中的value值替换DataFrame df1里的value值。注意:df1的name列存在重复值,df2的name列是唯一的。
原始数据
df1
| id | country | name | value |
|---|---|---|---|
| 1 | romania | john | 100 |
| 2 | russia | emma | 200 |
| 3 | usa | mark | 400 |
| 4 | china | emma | 300 |
| 5 | portugal | nick | 200 |
df2
| id | name | value |
|---|---|---|
| 1 | emma | 2 |
| 2 | mark | 3 |
期望结果
| id | country | name | value |
|---|---|---|---|
| 1 | romania | john | 100 |
| 2 | russia | emma | 2 |
| 3 | usa | mark | 3 |
| 4 | china | emma | 2 |
| 5 | portugal | nick | 200 |
解决方案
可以用Pandas的map()方法结合字典映射实现,以下是具体步骤:
方法实现
- 从
df2构建name到value的映射关系(利用df2的name唯一性):
value_mapping = df2.set_index('name')['value'].to_dict()
- 用映射关系替换
df1的value列,同时保留不在映射中的原始值:
df1['value'] = df1['name'].map(value_mapping).fillna(df1['value'])
也可以合并成一行代码,无需单独创建字典:
df1['value'] = df1['name'].map(df2.set_index('name')['value']).fillna(df1['value'])
完整代码示例
import pandas as pd # 初始化df1 df1 = pd.DataFrame({ 'id': [1, 2, 3, 4, 5], 'country': ['romania', 'russia', 'usa', 'china', 'portugal'], 'name': ['john', 'emma', 'mark', 'emma', 'nick'], 'value': [100, 200, 400, 300, 200] }) # 初始化df2 df2 = pd.DataFrame({ 'id': [1, 2], 'name': ['emma', 'mark'], 'value': [2, 3] }) # 执行替换操作 df1['value'] = df1['name'].map(df2.set_index('name')['value']).fillna(df1['value']) # 输出结果 print(df1)
代码说明
df2.set_index('name')['value']:将df2的name设为索引,提取对应value序列,实现按name快速匹配值。map():将df1的每个name值映射到df2对应的value,不存在的name会返回NaN。fillna(df1['value']):把NaN替换为df1原有的value,确保仅替换df2中存在的name对应值。
内容的提问来源于stack exchange,提问作者hacpires
相关产品推荐
相关产品推荐

