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)
验证结果
针对你给出的示例数据,两种方案都会得到如下结果:
| A | A_cleaned |
|---|---|
| E19 | 300 |
| V17 | 300 |
| 23.12 | 23 |
| 23.4 | 23 |
| 23 | 23 |
| 42 | 42 |
| 48 | 48 |
内容的提问来源于stack exchange,提问作者scr
相关产品推荐
相关产品推荐

