如何在Python DataFrame中实现基于列值的条件替换?
Python DataFrame值替换解决方案
问题说明
现有两个Pandas DataFrame(df1、df2),需生成目标DataFrame df3,替换规则如下:
- 当df2中单元格值为1时,替换为df1对应行的Val1值
- 当df2中单元格值为2时,替换为df1对应行的Val2值
- 其他值保持不变
原始数据
df1
| Var | Val1 | Val2 |
|---|---|---|
| var1 | 6 | 7 |
| var2 | 5 | -4 |
| var3 | -9 | 3 |
| var4 | 3 | -2 |
df2
| var | S1 | S2 | S3 | S4 |
|---|---|---|---|---|
| var1 | 1 | 0 | 0 | 2 |
| var2 | 0 | 1 | 2 | 0 |
| var3 | 1 | 0 | 1 | 2 |
| var4 | 1 | 0 | 2 | 0 |
预期结果df3
| var | S1 | S2 | S3 | S4 |
|---|---|---|---|---|
| var1 | 6 | 0 | 0 | 7 |
| var2 | 0 | 5 | -4 | 0 |
| var3 | -9 | 0 | -9 | 3 |
| var4 | 3 | 0 | -2 | 0 |
实现步骤
1. 创建测试数据
如果还没有现成的df1和df2,可用以下代码生成:
import pandas as pd # 构建df1 df1 = pd.DataFrame({ 'Var': ['var1', 'var2', 'var3', 'var4'], 'Val1': [6, 5, -9, 3], 'Val2': [7, -4, 3, -2] }) # 构建df2 df2 = pd.DataFrame({ 'var': ['var1', 'var2', 'var3', 'var4'], 'S1': [1, 0, 1, 1], 'S2': [0, 1, 0, 0], 'S3': [0, 2, 1, 2], 'S4': [2, 0, 2, 0] })
2. 核心替换逻辑
推荐两种实用方法,按需选择:
方法一:利用replace快速映射(高效简洁)
# 将df1的索引设为Var,方便按行匹配取值 df1_indexed = df1.set_index('Var') # 定义替换规则:1对应df1的Val1列,2对应Val2列 replace_rules = { 1: df1_indexed['Val1'], 2: df1_indexed['Val2'] } # 复制df2作为df3的基础,避免修改原数据 df3 = df2.copy() # 对df3中除了var列以外的所有列应用替换规则 df3[df3.columns[1:]] = df3[df3.columns[1:]].replace(replace_rules)
方法二:逐元素判断(直观易懂)
# 把df1转成字典,方便通过var快速获取对应行的Val1和Val2 val_map = df1.set_index('Var').to_dict('index') # 定义单个元素的替换函数 def replace_single_val(val, current_var): if val == 1: return val_map[current_var]['Val1'] elif val == 2: return val_map[current_var]['Val2'] else: return val # 遍历df2的每一行,对每个元素应用替换函数 df3 = df2.apply(lambda row: row.apply(lambda x: replace_single_val(x, row['var'])), axis=1)
3. 验证结果
运行上述任意一种方法后,打印df3即可得到预期结果。
方法解释
- 方法一:Pandas的
replace方法支持用Series作为替换值,将df1索引设为Var后,和df2的var列完全匹配,替换时会自动按行对应取值,效率很高,适合处理大数据量。 - 方法二:通过自定义函数逐元素判断,逻辑直观,新手能快速理解替换规则的对应关系,适合学习底层逻辑,但数据量大时效率不如方法一。
内容的提问来源于stack exchange,提问作者user2088697
相关产品推荐
相关产品推荐

