Python中使用re.sub处理pandas列报错:期望字符串类对象
问题:使用re.sub处理Pandas列时触发TypeError
我尝试用Python的re库做正则替换,已经把Pandas的Publisher URL列用astype(str)转换,但该列还是object类型。直接用re.sub处理这一列时触发TypeError,报错“expected string or bytes-like object”。相关代码、数据类型输出及错误详情如下:
相关代码
import os import re import pandas as pd # 读取Excel文件 df = pd.read_excel('Upload to dashboard - Untitled (1).xlsx', skiprows = 7) df.drop(df.tail(7).index,inplace=True) # 删除最后7行 print(df.head(3)) df['Publisher URL'] = df['Publisher URL'].fillna('') df['Publisher URL'] = df['Publisher URL'].astype(str) df['Publisher URL'] = df['Publisher URL'].str.replace('gerd#','') print(df.dtypes) df['Publisher URL2'] = df['Publisher URL'].str.replace('www.','') trim = re.sub('(.*)(?:\bm\.)(.*)|(.*)','',df['Publisher URL']) print(df['trim']) df.to_csv("C:/out.csv")
数据类型输出
[3 rows x 8 columns] Unnamed: 0 object Buying Agency object Advertiser object Publisher URL object Date object Buy Type object Ad Type object No. of Ads float64
错误信息
File ~\.spyder-py3\temp.py:30 in <module> trim = re.sub('(.*)(?:\bm\.)(.*)|(.*)','',df['Publisher URL']) File ~\Anaconda3\lib\re.py:210 in sub return _compile(pattern, flags).sub(repl, string, count) TypeError: expected string or bytes-like object
请问如何修改脚本才能正常使用re.sub函数?注:正则表达式经验证是正确的。
解决方案
错误根源是**re.sub是Python标准库函数,仅支持处理单个字符串/字节对象,无法直接接收Pandas的Series对象**(即使Series内部存储的是字符串,整体仍是Series类型)。以下两种修改方式均可解决问题:
方法1:使用Pandas的str.replace(推荐)
Pandas的str.replace原生支持正则表达式,专门用于处理Series中的字符串,用法与re.sub兼容,直接替换原re.sub代码即可:
# 用str.replace替代re.sub,直接处理Series df['trim'] = df['Publisher URL'].str.replace(r'(.*)(?:\bm\.)(.*)|(.*)', '')
方法2:用apply配合re.sub
如果一定要使用re.sub,可以通过apply对Series的每一个元素单独执行替换:
# 对Series的每个元素应用re.sub df['trim'] = df['Publisher URL'].apply(lambda x: re.sub(r'(.*)(?:\bm\.)(.*)|(.*)', '', x))
补充说明
- 正则表达式前加
r表示原始字符串,避免转义字符解析问题; - 你之前的
astype(str)操作是有效的,Pandas中object类型就是字符串的存储载体,不影响后续字符串操作; - 原代码中
print(df['trim'])需要放在生成df['trim']列之后,否则会因找不到该列报错。
内容的提问来源于stack exchange,提问作者Aki
相关产品推荐
相关产品推荐

