如何在pandas和SQL中筛选x列不含0的唯一product值
筛选所有x列取值均不含0的product实现方案
问题说明
原有实现逻辑错误:test.query("select distinct (product) where x not in (0) ")存在两个问题:
- 混淆了pandas
query()方法的语法规则,该方法不支持直接写原生SQL语句 - 逻辑上仅匹配存在x不等于0的product,会把同时存在x=0记录的product(如示例中的a)错误命中,不符合需求。
Pandas 正确实现
核心逻辑:按product分组后,校验每个分组下的所有x值是否都不等于0,保留符合条件的分组后去重即可。
写法1:groupby + filter
# 得到符合要求的product去重结果 res = test.groupby('product').filter(lambda group: (group['x'] != 0).all())['product'].unique()
输出结果为['b', 'c'],符合预期。
写法2:groupby + transform
res = test[test.groupby('product')['x'].transform(lambda x: (x != 0).all())]['product'].unique()
SQL 正确实现
核心逻辑:按product分组后,通过HAVING条件过滤掉存在x=0记录的分组。
通用写法(兼容所有SQL数据库)
SELECT product FROM test GROUP BY product HAVING SUM(CASE WHEN x = 0 THEN 1 ELSE 0 END) = 0;
简化写法(支持布尔值转数值的数据库如MySQL、PostgreSQL可用)
SELECT product FROM test GROUP BY product HAVING MAX(x = 0) = 0;
两种写法均会返回b、c两个结果。
内容的提问来源于stack exchange,提问作者janicebaratheon
相关产品推荐
相关产品推荐

