You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分组后如何对同一列不同分类值同时设置多逻辑条件过滤?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:57:25