如何按某列值的区间范围对DataFrame进行索引筛选
解决Pandas按列值范围筛选DataFrame子集的问题
我来帮你搞定这个用Pandas筛选DataFrame子集的问题~你尝试通过Age列的数值范围提取子集,但在条件写法上踩了个小坑,咱们一步步理清楚。
原始代码里的问题
你写的这行代码是没法正确工作的:
mid_range = df[hi>= df['Age']>=lo]
这是因为Pandas的Series比较会返回布尔数组,普通Python的链式比较写法在这里没法被正确解析,要么报错,要么得到完全不符合预期的结果。
正确的实现方式
要筛选出Age在lo(10)到hi(14)之间的行,得用&(逻辑与)连接两个独立条件,而且每个条件都要套上括号——这是为了避免运算符优先级搞乱逻辑。
完整修正后的代码
import pandas as pd import numpy as np data = [['Alex',15,4],['Bob',5,1],['Clarke',13,2],['dan',6,2],['eve',19,1],['fin',12,1],['ginny',11,2],['hal',14,1],['ian',13,3],['jen',9,1] ] df = pd.DataFrame(data,columns=['Name','Age','Pets']) print("原始DataFrame:") print(df) lo = 10 hi = 14 # 筛选Age >= 10的行 lo_range = df[df['Age']>=lo] print('\nlo_range (Age >= 10):') print(lo_range) # 正确筛选10 ≤ Age ≤14的行 mid_range = df[(df['Age'] >= lo) & (df['Age'] <= hi)] print('\nmid_range (10 ≤ Age ≤14):') print(mid_range)
关键说明
- 每个条件
df['Age'] >= lo和df['Age'] <= hi都会生成一个布尔Series,标记每行是否满足对应条件 - 用
&连接这两个布尔Series,就能得到同时满足两个条件的行的标记 - 必须给每个条件加括号:因为
&的优先级比>=/<=高,不加括号会先计算lo & df['Age'],直接触发错误
另外提一句,你最后提到的mid_range = df[( df['Age']>=lo) & (df['Age']>=hi)]其实是筛选Age >= 14的行(因为hi比lo大),如果这不是你的预期,记得把第二个条件改成df['Age'] <= hi哦。
内容的提问来源于stack exchange,提问作者Windy71
相关产品推荐
相关产品推荐

