如何用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
相关产品推荐
相关产品推荐

