用 df[condition] 做数值范围筛选最直接,应使用布尔索引而非循环或 apply;常见错误是混用 and/or,正确写法为 (df['age'] > 18) & (df['age']
用
df[condition]做数值范围筛选最直接Pandas 里筛数值范围,别绕弯写循环或
apply,直接用布尔索引。核心就是构造一个返回True/False的条件表达式,丢进方括号里。
- 常见错误:写成
df['age'] > 18 and df['age'] —— 报 <code>ValueError: The truth value of a Series is ambiguous,因为and不支持 Series;必须用&(且)、|(或)、~(非)- 正确写法:
df[(df['age'] > 18) & (df['age'] ,注意括号不能省,运算符优先级会导致意外结果- 如果字段含缺失值(
NaN),NaN > 30返回False,所以默认不包含缺失行;需要保留NaN可加df['age'].between(18, 65, inclusive='both')
between()更安全,尤其处理闭区间和缺失值当你要“大于等于 A 且小于等于 B”时,
between()比手写两个比较更少出错,也更易读。
- 默认
inclusive='both',即闭区间;设成'neither'就是开区间,'left'或'right'控制单侧- 它对
NaN返回False,但不会报错;若想把NaN当作有效值保留,得额外用df['col'].isna() | df['col'].between(...)- 性能上和手写布尔索引几乎无差别,底层都是向量化操作,不用怕慢
- 示例:
df[df['price'].between(100, 500, inclusive='left')]表示100用
query()写条件更接近自然语言,但有坑适合复杂多条件、变量插值或代码可读性优先的场景,但要注意字符串解析限制和变量作用域。
- 变量引用要加
@前缀,比如min_val = 25,就得写df.query('age > @min_val');不加会当成列名找,报KeyError- 列名含空格或特殊字符(如
'user id')必须用反引号:df.query('`user id` > 100')- 不支持所有 Python 语法,比如不能用
isinstance()、自定义函数,也不能嵌套三元表达式- 小数据集看不出差异,但大数据量下
query()因字符串解析略慢于布尔索引,一般差 10%–20%链式筛选时注意视图 vs 副本问题
连续用方括号筛选(比如
df[df.A > 1][df.B )容易触发 <code>SettingWithCopyWarning,不是语法错,而是可能改不到原数据。数值范围筛选本身不难,难的是条件组合时括号漏写、运算符用错、还有链式调用后默默失效——这些地方一卡就是半小时。
- 根本原因是 Pandas 有时返回视图(view),有时返回副本(copy),链式索引会让赋值行为不可控
- 正确做法:用一次布尔索引合并所有条件,或用
.loc显式定位:df.loc[(df.A > 1) & (df.B- 如果真要分步,中间加
.copy()明确断开连接,比如subset = df[df.A > 1].copy(); subset = subset[subset.B- 这个坑在 Jupyter 里常被忽略,直到你改了值却没反映到原始 DataFrame 上才意识到
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!












