如何在pandas DataFrame同一列上合并两个范围筛选条件
问题原因梳理
- 用
&无返回结果的原因
- 你先执行了
df = df.loc[mask],这一步已经将原df过滤为仅包含age在30-40区间的行,后续生成的mask1是基于这个过滤后的小数据集计算的,自然不存在同时满足30-40和50-60两个区间的数值,所以返回空结果。 - 此外
&是按位与运算符,逻辑是「同时满足两个条件」,你的需求是只要落在任意一个区间就算符合,本身就不应该用&做合并。
- 用
or报错的原因
Python原生的or/and运算符会尝试将整个布尔Series转换为单个布尔值,pandas不支持这种隐式转换,因此会抛出你看到的ValueError。pandas中针对布尔序列的逻辑或、逻辑与运算,对应使用|(按位或)和&(按位与)运算符。
正确实现方式
步骤1:基于原始未过滤的数据集生成两个筛选条件
import pandas as pd # 原始数据 data = [ 23, 50, 32, 21, 24, 20, 68, 52, 41, 44, 29, 70, 33, 56, 72] df = pd.DataFrame(data, columns = ['age']) # 两个筛选条件都基于完整的原始df生成 mask = (df['age'] >= 30) & (df['age'] <=40) mask1 = (df['age'] >= 50) & (df['age'] <=60)
步骤2:用|合并两个条件做筛选
# 满足任意一个区间条件即保留 df_filtered = df.loc[mask | mask1]
更简洁的写法
可以用pandas内置的between方法简化区间判断代码:
df_filtered = df.loc[df['age'].between(30,40) | df['age'].between(50,60)]
最终筛选结果会保留age为32、33、50、52、56的5行数据。
内容的提问来源于stack exchange,提问作者Diop Chopra
相关产品推荐
相关产品推荐

