You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python DataFrame中实现基于列值的条件替换?

Python DataFrame值替换解决方案

问题说明

现有两个Pandas DataFrame(df1、df2),需生成目标DataFrame df3,替换规则如下:

  • 当df2中单元格值为1时,替换为df1对应行的Val1值
  • 当df2中单元格值为2时,替换为df1对应行的Val2值
  • 其他值保持不变

原始数据

df1

VarVal1Val2
var167
var25-4
var3-93
var43-2

df2

varS1S2S3S4
var11002
var20120
var31012
var41020

预期结果df3

varS1S2S3S4
var16007
var205-40
var3-90-93
var430-20

实现步骤

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:10:16