分组后如何对同一列不同分类值同时设置多逻辑条件过滤?
Pandas分组筛选问题解决
问题根源
你原代码的逻辑错误在于要求同一行数据同时满足Event为sales和basket,这显然不可能——一行只能有一个Event值,因此永远不会有符合条件的行,自然返回空结果。
正确解法思路
我们需要的是整个Product组同时满足两个条件:
- 组内存在
Event='sales'且Count<1的记录 - 组内存在
Event='basket'且Count>1的记录
之后再从符合条件的组中提取Event='basket'的行。
具体实现代码
方法一:先筛选符合条件的产品,再提取目标行
# 筛选出满足两个组级条件的Product valid_products = df.groupby('Product').filter( lambda group: # 组内存在sales且Count<1的记录 ((group['Event'] == 'sales') & (group['Count'] < 1)).any() and # 组内存在basket且Count>1的记录 ((group['Event'] == 'basket') & (group['Count'] > 1)).any() )['Product'].unique() # 提取这些产品的basket行 result = df[(df['Product'].isin(valid_products)) & (df['Event'] == 'basket')]
方法二:用transform标记组级条件,再筛选
# 给每行标记所在组是否满足sales条件 df['valid_sales_group'] = df.groupby('Product').apply( lambda g: ((g['Event'] == 'sales') & (g['Count'] < 1)).any() ).reindex(df['Product']).values # 给每行标记所在组是否满足basket条件 df['valid_basket_group'] = df.groupby('Product').apply( lambda g: ((g['Event'] == 'basket') & (g['Count'] > 1)).any() ).reindex(df['Product']).values # 筛选同时满足两个组条件且Event为basket的行 result = df[(df['valid_sales_group'] & df['valid_basket_group']) & (df['Event'] == 'basket')] # 清理临时列(可选) result = result.drop(columns=['valid_sales_group', 'valid_basket_group'])
验证结果
运行上述代码后,result会返回你期望的行:
Product Event Sum Count 20 watch basket 30 2
内容的提问来源于stack exchange,提问作者PerfectLikeNew
相关产品推荐
相关产品推荐

