Python:如何高效删除不满足多组条件的DataFrame行
高效筛选DataFrame的方案
首先还原示例DataFrame的构造代码:
import pandas as pd data = { 'Grade': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'Price': [2, 10, 9, 10, 8, 7, 6, 10, 12, 11, 11, 12, 10, 9, 9, 10, 11], 'Group': ['apple']*8 + ['berry']*9 } df = pd.DataFrame(data)
以下是两种避免拆分拼接的高效筛选方案:
方法一:向量化布尔条件组合
利用Pandas的向量化特性,直接组合所有筛选条件,一次完成筛选,是大型数据集下性能最优的方式:
# 构建筛选掩码 mask = ( ((df['Group'] == 'apple') & (df['Grade'] == 'A') & df['Price'].between(9, 10)) | ((df['Group'] == 'apple') & (df['Grade'] == 'B') & df['Price'].between(7, 8)) | ((df['Group'] == 'berry') & (df['Grade'] == 'A') & df['Price'].between(11, 12)) | ((df['Group'] == 'berry') & (df['Grade'] == 'B') & df['Price'].between(9, 10)) ) # 筛选符合条件的行 filtered_df = df[mask]
方法二:字典映射规则(高可维护性)
如果后续需要修改或新增筛选规则,用字典映射对应区间的方式更清晰,同时通过向量化转换保证性能:
# 定义(Group, Grade)对应的Price区间规则 rule_map = { ('apple', 'A'): (9, 10), ('apple', 'B'): (7, 8), ('berry', 'A'): (11, 12), ('berry', 'B'): (9, 10) } # 生成组合键并映射区间上下限 group_grade_key = df['Group'] + '_' + df['Grade'] lower_limit = pd.Series({f"{k[0]}_{k[1]}": v[0] for k, v in rule_map.items()}) upper_limit = pd.Series({f"{k[0]}_{k[1]}": v[1] for k, v in rule_map.items()}) # 向量化生成筛选掩码 mask = (df['Price'] >= lower_limit[group_grade_key].values) & (df['Price'] <= upper_limit[group_grade_key].values) filtered_df = df[mask]
筛选结果示例
最终得到的filtered_df会保留所有符合条件的行:
| Grade | Price | Group |
|---|---|---|
| A | 10 | apple |
| A | 9 | apple |
| A | 10 | apple |
| B | 8 | apple |
| B | 7 | apple |
| A | 12 | berry |
| A | 11 | berry |
| A | 11 | berry |
| A | 12 | berry |
| B | 9 | berry |
| B | 9 | berry |
| B | 10 | berry |
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

