Pandas批量清洗DataFrame多列触发replace相关报错如何解决
问题根因
- 报错
'float' object has no attribute 'replace':数据中存在NaN空值,这类值默认是float类型,不存在字符串的replace方法,替换逻辑碰到空值就会触发报错。另外你写的循环逻辑存在冗余,遍历列的同时又对整个df做apply,会重复执行替换操作。 - 报错
'Dataframe' object has no attribute 'str':.str是pandas单列Series专属的字符串访问接口,不能直接在多列组成的DataFrame对象上调用。
可直接运行的解决代码
用正则一次性匹配所有\加大写英文字母的脏字符,不需要逐个枚举要删除的字符,两种实现方式选一种即可:
方式1:全元素批量处理(推荐)
用applymap遍历DataFrame中所有元素,先统一转字符串避免类型报错,清洗完成后再转回数值类型:
import pandas as pd import numpy as np import re # 测试数据(修正了原示例里的转义、nan未定义的问题) df = pd.DataFrame({ 'A': ['7.3\\N\\P', np.nan, '11.0\\R\\Z'], 'B': [np.nan, 'nan\\A\\G', '10.8\\F\\U'], 'C': ['12.4\\A\\I', '13.3\\H\\Z', '8.200000000000001\\B\\W'] }) # 批量清洗逻辑 df = ( df.applymap(lambda x: re.sub(r'\\[A-Z]', '', str(x))) # 所有元素转字符串后删除脏字符 .replace('nan', np.nan) # 把转成字符串的空值还原 .astype(float) # 把清洗完的内容转回数值类型 )
如果只需要处理前3列,把上面的df替换为df.iloc[:, 0:3]即可。
方式2:逐列调用字符串接口
如果你习惯用.str.replace的写法,可以遍历每一列单独处理,先把列转为pandas专用的字符串类型,就能避免float类型空值报错:
for col in df.columns: # 先转StringDtype,空值会保留为pd.NA不会触发类型错误 df[col] = df[col].astype('string').str.replace(r'\\[A-Z]', '', regex=True) # 清洗完成后转回数值类型 df = df.astype(float)
两种方式执行后得到的结果一致,所有列里的反斜杠+大写字母后缀都会被清除,数值正常保留,空值也不会丢失。
内容的提问来源于stack exchange,提问作者Miriama Pecqueux
相关产品推荐
相关产品推荐

