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

如何用Python Pandas在非NaN时用另一列替换DataFrame列值?

简洁更新Pandas DataFrame列(跳过指定值)

场景与需求

给定如下DataFrame:

import pandas as pd
data1 = {
     "date": [1, 2, 3],
     "height": [420.3242, 380.1, 390],
     "height_new": [300, 380.1, "nan"],
     "duration": [50, 40, 45],
     "feeling" : ["great","good","great"]
    }
df = pd.DataFrame(data1)

需要实现:用height_new列的值覆盖更新height列,但当height_new的值为字符串"nan"时,保留height列的原始值。

你当前的实现代码较为繁琐:

for x, y in zip(df['height'], df['height_new']) :
  if y != 'nan':
    df['height'].replace(x, y, inplace= True)
    x = y

Pythonic优化方案

下面提供几种更简洁高效的实现方式:

方法1:使用loc直接定位更新

利用布尔索引筛选出height_new不等于"nan"的行,直接按行精准赋值更新:

df.loc[df['height_new'] != 'nan', 'height'] = df.loc[df['height_new'] != 'nan', 'height_new']

这种方式采用Pandas向量化操作,避免循环,效率更高,且不会出现原始代码中重复值误更新的问题。

方法2:转换字符串"nan"为NaN后用combine_first

如果后续需要处理缺失值,可先将字符串"nan"转为Pandas标准NaN,再用combine_first方法自动用非缺失值填充:

# 把字符串"nan"转为Pandas NaN
df['height_new'] = pd.to_numeric(df['height_new'], errors='coerce')
# 用height_new的非NaN值更新height,保留原始值在缺失位置
df['height'] = df['height_new'].combine_first(df['height'])

这种方式逻辑清晰,适合后续有缺失值处理需求的场景。

方法3:使用mask方法实现条件替换

mask方法会将满足布尔条件的位置替换为指定值,刚好匹配我们的需求:

df['height'] = df['height'].mask(df['height_new'] != 'nan', df['height_new'])

逻辑说明:当height_new不等于"nan"时,将height对应位置的值替换为height_new的值;不满足条件时保留height原始值。

注意事项

你的原始循环代码存在风险:如果height列存在重复值,replace会把所有匹配的数值全部替换,可能导致非目标行被误更新。上述优化方案均为按行精准操作,不会出现该问题。

内容的提问来源于stack exchange,提问作者Bojan Milinic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:45:34