如何使用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

