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

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会保留所有符合条件的行:

GradePriceGroup
A10apple
A9apple
A10apple
B8apple
B7apple
A12berry
A11berry
A11berry
A12berry
B9berry
B9berry
B10berry

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:25:32