Pandas按条件保留行:多水果批量高效过滤(用列索引)
高效实现Pandas多条件行筛选(用列索引)
核心思路
不用逐个筛选再拼接,直接通过布尔条件组合+一次性切片完成筛选,大幅减少内存开销和运行时间,完全使用列索引避开列名依赖。
代码实现
1. 导入依赖
import pandas as pd import numpy as np
2. 示例数据(可替换为你的数据集)
假设:
- 列索引0 = 水果名称列
- 列索引1 = amt1列
- 列索引2 = amt2列
data = [ ['苹果', 6, 3], ['苹果', 4, 2], ['香蕉', 2, 4], ['香蕉', 0, 3], ['橙子', 3, 2], ['橙子', 0, 1] ] df = pd.DataFrame(data)
3. 定义多水果筛选条件
把每种水果的筛选规则写成布尔数组,存入列表:
conditions = [ # 苹果:amt1≥5 且 amt2<5 (df.iloc[:, 0] == '苹果') & (df.iloc[:, 1] >= 5) & (df.iloc[:, 2] < 5), # 香蕉:amt1≥1 且 amt2<5 (df.iloc[:, 0] == '香蕉') & (df.iloc[:, 1] >= 1) & (df.iloc[:, 2] < 5), # 继续添加剩余8种水果的条件,格式完全一致 (df.iloc[:, 0] == '橙子') & (df.iloc[:, 1] >= 2) & (df.iloc[:, 2] < 3) ]
4. 合并条件并筛选
用np.logical_or.reduce合并所有"或"条件,一次性提取符合要求的行:
# 合并所有条件(只要满足其中一个水果的规则就算符合) mask = np.logical_or.reduce(conditions) # 生成筛选后的数据集 filtered_df = df[mask]
为什么高效?
- 避免了多次创建小DataFrame再
concat的内存拷贝操作,大数据集下速度提升明显 - 仅做一次数据切片,计算逻辑更简洁,底层Pandas的向量化运算会优化执行效率
内容的提问来源于stack exchange,提问作者infinity
相关产品推荐
相关产品推荐

