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

遍历Pandas数据框生成的列表时re.findall()报错排查

解决TypeError:处理驼峰命名字符串时遇到非字符串元素问题

老哥,我来帮你捋捋这个问题哈!你遇到的TypeError: expected string or bytes-like object,根本原因不是你遍历的方式错了,而是你的subsectors列表里混进了非字符串类型的元素——比如NaN、None或者数字之类的。

为啥会报错?

虽然你是在逐个遍历列表元素,但re.findall()和re.sub()只接受字符串/字节类型的输入。如果你的Pandas列subsectors里存在缺失值(比如NaN),或者其他非字符串数据,转成列表后这些元素会保留原类型(比如numpy.nan或者None),当遍历到它们时,正则函数就会直接抛出类型错误。

几种解决方案

方案1:清理列表,确保每个元素都是字符串

遍历的时候先判断元素类型,只处理字符串,非字符串元素可以转成默认值或者跳过:

import re
subsectors = df['subsectors'].tolist()

processed_subsectors = []
for s in subsectors:
    # 只处理字符串类型的元素
    if isinstance(s, str):
        processed_subsectors.append(' '.join(re.findall('[A-Z][^A-Z]*', s)))
    else:
        # 非字符串元素可以设为空字符串、None,或者根据需求自定义
        processed_subsectors.append('')

方案2:直接在Pandas中处理(更推荐)

没必要转成列表,Pandas的字符串访问器str可以直接处理整列数据,还能自动处理缺失值:

# 方法A:用正则替换分割驼峰
df['processed_subsectors'] = df['subsectors'].str.replace(r'(?<=[a-z])(?=[A-Z])', ' ', regex=True)

# 方法B:用findall拼接的方式
df['processed_subsectors'] = df['subsectors'].str.findall('[A-Z][^A-Z]*').str.join(' ')

这种方式不仅高效,还能保持数据框的结构,缺失值会自动保留为NaN,不会触发错误。

方案3:先把Pandas列转成字符串类型再转列表

如果一定要用列表处理,可以先把列强制转成字符串,再生成列表:

# 先填充缺失值为空字符串,再转成字符串类型,最后转列表
subsectors = df['subsectors'].fillna('').astype(str).tolist()
# 之后用你的列表推导式就不会报错了
processed = [' '.join(re.findall('[A-Z][^A-Z]*', s)) for s in subsectors]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:27:34