如何将Pandas DataFrame列中仅数值替换为另一列对应值
问题原因
你的判断完全正确,失效根源是sposob-produkcji列为混合数据类型:同时存储了字符串值(如FABRYCZNY)和数值类型值(如整数2022、1975)。.str.isnumeric()和.str.isdigit()是Pandas字符串访问器的方法,仅对字符串类型的单元格生效,数值类型的单元格调用这两个方法会返回NaN而非布尔值,因此无法命中数值类条目,替换逻辑自然不生效。
通用实现方案
不需要逐个枚举年份做匹配,使用pd.to_numeric的错误捕获机制做判断,可兼容数值本身、字符串格式数字两种场景,是最稳妥的通用方案:
import pandas as pd import numpy as np # 生成布尔掩码:标记sposob-produkcji列中所有数值类值的位置 is_numeric = pd.to_numeric(cars['sposob-produkcji'], errors='coerce').notna() # 按掩码完成替换 cars['sposob-produkcji'] = np.where( is_numeric, cars['rok-produkcji'], cars['sposob-produkcji'] )
逻辑说明
pd.to_numeric(cars['sposob-produkcji'], errors='coerce')会逐值尝试转换为数值类型:- 本身为数值类型的值、字符串格式的数字会被正常转换为数值
- 非数值字符串(如
FABRYCZNY)转换失败时会被标记为NaN
- 后续调用
.notna()即可得到准确的布尔掩码,True对应所有需要替换的数值类条目。
如果需要避免替换后列出现混合类型问题,可在替换时统一将值转为字符串格式:
cars['sposob-produkcji'] = np.where( is_numeric, cars['rok-produkcji'].astype(str), cars['sposob-produkcji'].astype(str) )
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

