Pandas .query API无法按预期工作,如何实现等效行过滤?
使用Pandas .query() API复现布尔索引过滤逻辑
当然可以用.query()实现相同的过滤逻辑,你之前的写法出错是因为在.query()中不能直接用Python的in运算符检查Series元素的子串,必须用Pandas的.str.contains()方法来处理字符串匹配。
正确的.query()代码
import pandas as pd data = { 'roll_Call': [32041, 60164, 164989, 179741, 231414], 'name': ['Cozy Kim', 'Sam Juday', 'Jessica M', 'Ajay Kim Jong', 'Kim Jong'], 'std': [2, 3, 1, 1, 1] } df = pd.DataFrame(data) # 用.query()实现相同的过滤逻辑 df = df.query("not (name.str.contains('kim', case=False) and name.str.contains('jong', case=False) and std <= 1)")
代码说明
- 字符串匹配:用
name.str.contains('kim', case=False)实现不区分大小写的子串检查,和布尔索引里的df['name'].str.contains('kim', case=False)效果完全一致。 - 逻辑组合:在
.query()中用and代替布尔索引的&来组合多个条件,语法更贴近自然逻辑表达。 - 否定逻辑:用
not包裹整个条件组,对应布尔索引里的~,实现“排除满足所有条件的行”的需求。
验证结果
运行上述代码后,会排除掉name同时包含'kim'和'jong'且std≤1的两行(Ajay Kim Jong、Kim Jong),最终得到的DataFrame和你原来的布尔索引过滤结果完全一致。
内容的提问来源于stack exchange,提问作者r ram
相关产品推荐
相关产品推荐

