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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:35:31