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

Pandas匹配字符串列表加列拆行及str.contains报错解决

报错原因与修复

你遇到的报错是因为text列中存在非字符串类型的元素(比如空值、数值、列表等),str.contains只能处理字符串类型的值,首先可以先把text列强制转成字符串解决报错:

# 先统一转字符串,避免非字符串报错
df['text'] = df['text'].astype(str)

不过你写的现有代码只能筛选出包含任意目标水果的行,不能实现匹配到多个水果就拆分多行的需求,完整实现方案如下:

完整实现代码

import pandas as pd

# 示例构造你的原始DataFrame,实际使用时替换成你自己的df即可
df = pd.DataFrame({
    'user': ['Tom', 'Dick', 'Harry'],
    'text': ['I love bananas', 'I love apples', 'I love apples and bananas']
})
fruits = ['apples', 'bananas']

# 步骤1:把text列转字符串,避免非字符串报错
df['text'] = df['text'].astype(str)

# 步骤2:提取每行text中匹配到的所有水果,生成列表列
# 如果水果名称包含./*这类正则特殊字符,可替换为 '|'.join(re.escape(f) for f in fruits),提前导入re模块即可
df['matched_fruits'] = df['text'].str.findall('|'.join(fruits))

# 步骤3:把匹配到的水果列表拆分成多行,并重命名列
result = df.explode('matched_fruits').rename(columns={'matched_fruits': 'fruits'})

# 可选:过滤掉没有匹配到水果的行
# result = result.dropna(subset=['fruits'])

运行后result就是你要的预期输出:

usertextfruits
TomI love bananasbananas
DickI love applesapples
HarryI love apples and bananasapples
HarryI love apples and bananasbananas

逻辑说明

  • 用str.findall代替str.contains:findall会返回每行text中所有匹配到的水果组成的列表,而不是只返回布尔值判断是否包含
  • 用explode方法把列表类型的matched_fruits列拆分成多行,每个列表元素对应一行,其他列的值自动复用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:24:03