Pandas replace()替换字符串为整数触发Cannot set non-string value报错
报错原因
报错核心来自dtype='string'的强类型约束:这是pandas的StringDtype扩展数组类型,仅允许存储字符串与pd.NA,直接调用replace写入整数1/0时会触发类型校验拦截,这也是单值替换直接报错的根本原因。
全表一次性替换方案(无需逐列处理)
无需逐列写转换逻辑,也不需要自定义apply函数,直接通过全表类型兼容+映射替换+自动类型收敛即可实现需求,兼容pandas 1.4.1版本,代码如下:
import pandas as pd test = pd.DataFrame(data = {'a': [None, 'Y', 'N', '']}, dtype = 'string') result = test.astype(object).replace( to_replace={ 'Y': 1, 'N': 0, '': pd.NA } ).convert_dtypes()
运行后result['a']的取值为[<NA>, 1, 0, <NA>],列类型自动识别为支持空值的Int64扩展整数类型,完全符合预期。
方案说明
- 全程为表级操作,无需逐列指定字段,不管DataFrame里有多少个字符串类型列,只要值匹配替换规则就会自动生效
- 前置的
astype(object)是全表级轻量转换,不会修改非字符串列的原有值,仅解除StringDtype的强类型校验,避免替换时报错 - 末尾的
convert_dtypes()会自动做类型收敛:替换完成后存整数+空值的列会自动转为Int64类型,不会残留object类型的性能与类型隐患 - 替换规则支持自由扩展,后续需要新增其他值的映射,直接往
to_replace字典中追加键值对即可
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

