如何在Pandas DataFrame中实现“从不包含指定值”的筛选
嘿,我来帮你搞定这个数据筛选的问题!你需要找出那些完全没有West记录的Id对应的所有行对吧?这里有几种常用的SQL实现方式,都能精准得到你想要的结果:
方法1:使用NOT EXISTS子查询(推荐,性能优异)
这种方法逻辑最直观——直接检查当前Id是否不存在任何Item为West的记录,数据库优化器通常会对这种写法做很好的优化:
SELECT t1.Id, t1.Item FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Id = t1.Id AND t2.Item = 'West' );
方法2:GROUP BY + HAVING筛选Id后关联
先通过分组统计,筛选出从未出现过West的Id列表,再和原表关联获取这些Id的所有记录:
SELECT t.Id, t.Item FROM your_table t INNER JOIN ( SELECT Id FROM your_table GROUP BY Id -- 统计当前Id下West出现的次数,等于0说明从未出现 HAVING COUNT(CASE WHEN Item = 'West' THEN 1 END) = 0 ) filtered_ids ON t.Id = filtered_ids.Id;
也可以换一种HAVING的写法,逻辑是一样的:
SELECT t.Id, t.Item FROM your_table t WHERE t.Id IN ( SELECT Id FROM your_table GROUP BY Id HAVING SUM(CASE WHEN Item = 'West' THEN 1 ELSE 0 END) = 0 );
方法3:LEFT JOIN排除法
通过左连接匹配出有West记录的Id,然后排除这些Id的所有行:
SELECT t1.Id, t1.Item FROM your_table t1 LEFT JOIN your_table t2 ON t1.Id = t2.Id AND t2.Item = 'West' -- 左连接后如果t2.Id为空,说明该Id没有West记录 WHERE t2.Id IS NULL;
执行以上任意一种查询,都会返回你期望的结果:
Id Item
2 North
2 South
2 East
3 North
3 East
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

