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

Python处理DataFrame列替换触发TypeError,求助解决

解决DataFrame列清洗时的TypeError问题

错误原因分析

你遇到的TypeError: expected string or bytes-like object,核心问题是列'A'中混合了字符串和数值类型(比如示例里的23、42是整数,23.12、23.4是浮点数),而re.sub函数只能处理字符串对象,遍历到数值类型元素时就会报错。

另外,你原来的正则逻辑和需求不匹配:你需要把E/V开头的内容替换为300,但原代码是把E/V后面的数字保留并追加3000,这不符合预期。


解决方案一:使用Pandas字符串方法(简洁高效,适合大数据集)

因为你的数据集有10万+条记录,Pandas的内置str方法比map/apply更高效,而且自动处理类型转换问题:

import pandas as pd

# 1. 先将整列转为字符串类型,确保所有元素都能被正则处理
df['A'] = df['A'].astype(str)

# 2. 替换所有以E/V开头的内容为'300'
df['A_cleaned'] = df['A'].str.replace(r'^[EV].*', '300', regex=True)

# 3. 将小数形式的内容替换为整数部分(比如23.12→23,23.4→23)
df['A_cleaned'] = df['A_cleaned'].str.replace(r'^(\d+)\.\d+$', r'\1', regex=True)

# 4. 最终转为整数类型
df['A_cleaned'] = df['A_cleaned'].astype(int)

正则说明:

  • ^[EV].*:匹配以E或V开头的任意字符串,直接替换为300
  • ^(\d+)\.\d+$:匹配标准小数格式,提取小数点前的整数部分替换

解决方案二:自定义函数+apply(直观易读)

如果你更喜欢用自定义函数控制逻辑,可以先把元素转为字符串再处理:

import pandas as pd

def clean_value(x):
    x_str = str(x)
    # 处理E/V开头的内容
    if x_str.startswith(('E', 'V')):
        return '300'
    # 处理小数
    elif '.' in x_str:
        return x_str.split('.')[0]
    # 纯整数直接返回
    else:
        return x_str

# 应用函数并转为整数
df['A_cleaned'] = df['A'].apply(clean_value).astype(int)

验证结果

针对你给出的示例数据,两种方案都会得到如下结果:

AA_cleaned
E19300
V17300
23.1223
23.423
2323
4242
4848

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:17:43