基于Name和Price分组+Condition字符串列的DataFrame过滤需求
解决带Fit_Test条件的分组过滤问题
我来帮你实现这个结合分组和多规则过滤的需求,下面是基于Pandas的完整解决方案,完全匹配你给出的规则要求。
示例输入数据(Sample DF)
| ID | Name | Price | Condition | Fit_Test |
|---|---|---|---|---|
| 1 | Apple | 10 | Good | Super_Fit |
| 2 | Apple | 10 | OK | Super_Fit |
| 3 | Apple | 10 | Bad | Super_Fit |
| 4 | Orange | 12 | Good | Not_Fit |
| 5 | Orange | 12 | OK | Not_Fit |
| 6 | Banana | 15 | OK | Medium_Fit |
| 7 | Banana | 15 | Bad | Medium_Fit |
| 8 | Pineapple | 25 | OK | Medium_Fit |
| 9 | Pineapple | 25 | OK | Medium_Fit |
| 10 | Cherry | 30 | Bad | Medium_Fit |
预期输出数据(Expected DF)
| ID | Name | Price | Condition | Fit_Test |
|---|---|---|---|---|
| 1 | Apple | 10 | Good | Super_Fit |
| 2 | Apple | 10 | OK | Super_Fit |
| 3 | Apple | 10 | Bad | Super_Fit |
| 4 | Orange | 12 | Good | Not_Fit |
| 6 | Banana | 15 | OK | Medium_Fit |
| 8 | Pineapple | 25 | OK | Medium_Fit |
| 9 | Pineapple | 25 | OK | Medium_Fit |
| 10 | Cherry | 30 | Bad | Medium_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)
代码说明
- 自定义过滤函数:
filter_group会接收每个分组数据,先判断Fit_Test的值,再根据Condition的集合匹配对应规则,返回筛选后的子分组; - 分组应用逻辑:用
groupby按指定列分组,通过apply将过滤函数作用到每个分组上,最终自动合并所有分组的结果; - 兼容性:完美适配你提到的「初始方案(无Fit_Test)」和「更新方案(带Fit_Test)」——只要把函数里的
Fit_Test判断逻辑注释掉,就能切换到无Fit_Test的场景。
运行代码后,你会得到和预期完全一致的输出结果。
内容的提问来源于stack exchange,提问作者Rahul Agarwal
相关产品推荐
相关产品推荐

