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就是你要的预期输出:
| user | text | fruits |
|---|---|---|
| Tom | I love bananas | bananas |
| Dick | I love apples | apples |
| Harry | I love apples and bananas | apples |
| Harry | I love apples and bananas | bananas |
逻辑说明
- 用
str.findall代替str.contains:findall会返回每行text中所有匹配到的水果组成的列表,而不是只返回布尔值判断是否包含 - 用
explode方法把列表类型的matched_fruits列拆分成多行,每个列表元素对应一行,其他列的值自动复用
内容的提问来源于stack exchange,提问作者psychcphyscst
相关产品推荐
相关产品推荐

