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

如何使用pandas.query()检测DataFrame列表列中是否存在指定字符串?

问题描述

假设我有如下结构的DataFrame:

col1
0   ['str1', 'str2']
1   ['str3', 'str4']
2   []
3   ['str2', 'str4']
4   ['str1', 'str3']
5   []

我想用df.query()语句实现和'str3' in col1等效的筛选逻辑,最终得到如下结果:

col1
1   ['str3', 'str4']
4   ['str1', 'str3']

尝试使用df.query("col1.str.contains('str3')")时出现报错:

"None of [Float64Index([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,\n ...\n nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],\n dtype='float64', length=652)] are in the [index]"

推测是因为str.contains是针对字符串列的方法,而当前列是列表类型,空列表触发str访问器返回NaN,进而导致索引匹配错误。由于我需要制作支持用户自定义查询字符串的脚本,因此优先使用查询字符串方式,而非列表构造方法。

解决方案

直接在df.query()中使用apply结合lambda表达式来判断元素是否在列表中,语句如下:

df.query("col1.apply(lambda lst: 'str3' in lst)")

为什么之前的方法失效?

col1.str.contains('str3')的问题在于:str访问器是专门为字符串类型的列设计的,当列中元素是列表(非字符串)时,str.contains会对每个列表返回NaN,这些NaN组成的Series无法正确匹配索引,最终抛出错误。而使用apply(lambda lst: 'str3' in lst)可以直接遍历每个列表元素,判断目标字符串是否存在,返回布尔值Series,能被query正确识别用于筛选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:02:29