如何依据各列的最小值与最大值筛选DataFrame
按列指定区间筛选DataFrame的解决方案
针对你有一个包含4698行的DataFrame,需要按每列对应的最小最大值条件筛选行的需求,这里提供两种实用的pandas实现方法:
方法一:向量化掩码筛选(高效处理大数据量)
这种方法通过构建布尔掩码,用向量化操作处理,适合你的大数据集,执行效率更高:
首先定义每列的区间条件(你可以根据实际需求修改数值):
import pandas as pd # 示例:键是列名,值是(最小值, 最大值)的元组 column_ranges = { 'A': (10, 50), 'B': (1, 10), 'C': (10, 85), 'D': (2, 80), 'E': (0.8, 3.0), 'F': (1, 9) }
然后生成掩码并筛选:
# 初始化掩码为全True,代表所有行初始都符合条件 mask = pd.Series([True] * len(df), index=df.index) # 遍历每个列的条件,逐步缩小符合条件的行范围 for col, (min_val, max_val) in column_ranges.items(): # 对当前列生成"在区间内"的布尔序列,和现有掩码做逻辑与 mask &= (df[col] >= min_val) & (df[col] <= max_val) # 应用掩码得到筛选后的DataFrame filtered_df = df[mask]
方法二:简洁的逐行检查(可读性优先)
如果更看重代码的简洁性和可读性,可以用apply配合all()来检查每行是否所有列都满足条件:
# 对每行应用检查:所有列都落在对应的区间内 filtered_df = df[df.apply(lambda row: all( min_val <= row[col] <= max_val for col, (min_val, max_val) in column_ranges.items() ), axis=1)]
额外说明
- 如果你的条件是按列顺序给出的列表(而非字典),可以先把它和列名对应起来:
# 示例:按A-F顺序排列的区间列表 ranges_list = [(10, 50), (1, 10), (10, 85), (2, 80), (0.8, 3.0), (1, 9)] column_ranges = dict(zip(df.columns, ranges_list)) - 确保每个区间的最小值≤最大值,否则会筛选出空结果
- 你的列都是数值型(
),无需额外类型转换;如果有非数值列,需要先处理或排除
内容的提问来源于stack exchange,提问作者Omry Atia
相关产品推荐
相关产品推荐

