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

基于Name和Price分组+Condition字符串列的DataFrame过滤需求

解决带Fit_Test条件的分组过滤问题

我来帮你实现这个结合分组和多规则过滤的需求,下面是基于Pandas的完整解决方案,完全匹配你给出的规则要求。


示例输入数据(Sample DF)

IDNamePriceConditionFit_Test
1Apple10GoodSuper_Fit
2Apple10OKSuper_Fit
3Apple10BadSuper_Fit
4Orange12GoodNot_Fit
5Orange12OKNot_Fit
6Banana15OKMedium_Fit
7Banana15BadMedium_Fit
8Pineapple25OKMedium_Fit
9Pineapple25OKMedium_Fit
10Cherry30BadMedium_Fit

预期输出数据(Expected DF)

IDNamePriceConditionFit_Test
1Apple10GoodSuper_Fit
2Apple10OKSuper_Fit
3Apple10BadSuper_Fit
4Orange12GoodNot_Fit
6Banana15OKMedium_Fit
8Pineapple25OKMedium_Fit
9Pineapple25OKMedium_Fit
10Cherry30BadMedium_Fit

核心规则回顾

需按Name和Price分组,结合Condition和Fit_Test列执行过滤:

  • 当Fit_Test = Super_Fit时,分组内所有行全部保留,不执行任何过滤;
  • 当Fit_Test ≠ Super_Fit时,按以下规则筛选:
    • 规则1:分组同时存在Good、Bad、OK → 仅保留Good行
    • 规则2:分组存在Good和OK → 仅保留Good行
    • 规则3:分组存在Bad和OK → 仅保留OK行
    • 规则4:分组是重复OK/Good,或仅存Bad → 保留全部行

Pandas实现代码

import pandas as pd

# 构造示例输入数据
data = {
    'ID': [1,2,3,4,5,6,7,8,9,10],
    'Name': ['Apple','Apple','Apple','Orange','Orange','Banana','Banana','Pineapple','Pineapple','Cherry'],
    'Price': [10,10,10,12,12,15,15,25,25,30],
    'Condition': ['Good','OK','Bad','Good','OK','OK','Bad','OK','OK','Bad'],
    'Fit_Test': ['Super_Fit','Super_Fit','Super_Fit','Not_Fit','Not_Fit','Medium_Fit','Medium_Fit','Medium_Fit','Medium_Fit','Medium_Fit']
}
df = pd.DataFrame(data)

def filter_group(group):
    # 优先判断Fit_Test:如果是Super_Fit,直接返回整个分组
    if group['Fit_Test'].iloc[0] == 'Super_Fit':
        return group
    
    # 获取当前分组的Condition集合,用来匹配规则
    cond_set = set(group['Condition'])
    
    # 按规则匹配筛选
    if {'Good', 'Bad', 'OK'}.issubset(cond_set):
        return group[group['Condition'] == 'Good']
    elif {'Good', 'OK'}.issubset(cond_set):
        return group[group['Condition'] == 'Good']
    elif {'Bad', 'OK'}.issubset(cond_set):
        return group[group['Condition'] == 'OK']
    else:
        # 剩余情况(重复值/仅单种状态)保留全部行
        return group

# 按Name和Price分组,应用自定义过滤函数
result_df = df.groupby(['Name', 'Price'], group_keys=False).apply(filter_group)

# 重置索引(可选,根据需求调整格式)
result_df = result_df.reset_index(drop=True)

# 打印验证结果
print(result_df)

代码说明

  1. 自定义过滤函数:filter_group会接收每个分组数据,先判断Fit_Test的值,再根据Condition的集合匹配对应规则,返回筛选后的子分组;
  2. 分组应用逻辑:用groupby按指定列分组,通过apply将过滤函数作用到每个分组上,最终自动合并所有分组的结果;
  3. 兼容性:完美适配你提到的「初始方案(无Fit_Test)」和「更新方案(带Fit_Test)」——只要把函数里的Fit_Test判断逻辑注释掉,就能切换到无Fit_Test的场景。

运行代码后,你会得到和预期完全一致的输出结果。

内容的提问来源于stack exchange,提问作者Rahul Agarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:40:51