pandas中如何删除无指定VAL1值且VAL2大于20的Groups分组
原代码错误点
- 拼写错误:pandas无
isnotin内置方法,判断元素不在指定列表需用~Series.isin(列表)的写法 - 运算符优先级问题:
&为按位与运算符,优先级高于比较运算符(>、==等),组合多条件时必须给每个比较子句单独加括号,否则会出现逻辑解析错误 - 逻辑层级偏差:需求是分组级的整体判断(先判定整个分组是否符合删除规则,再批量移除该分组的所有行),原代码为逐行判断逻辑,未聚合到分组维度,完全不匹配需求
- 判断方向相反:需求为删除同时满足两个条件的分组,
groupby.filter()方法需要对待删除的分组返回False,原代码的逻辑和需求的删除规则完全反向
正确实现代码
首先定义指定的VAL1过滤列表:
the_list = ['BIRD', 'CAT'] # 分组过滤逻辑 tab_filtered = tab.groupby('Groups').filter( # 保留规则:要么分组内存在指定VAL1的行,要么分组内所有VAL2均不大于20 lambda x: x['VAL1'].isin(the_list).any() or (x['VAL2'] <= 20).all() )
逻辑说明
上述代码通过逻辑等价推导(德摩根定律)简化了判断逻辑,和需求完全匹配:
- 只有当分组同时满足「无任何BIRD/CAT的VAL1行」、「所有行VAL2>20」两个删除条件时,才会被过滤移除
- 对照给定样例数据,仅G5分组符合删除规则,最终输出结果和期望完全一致
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

