遍历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
相关产品推荐
相关产品推荐

