一、按「行」筛选(最常用)
在 Pandas 中,对 DataFrame 的行进行筛选是数据分析中最常见的操作之一。以下是几种高效且实用的方法,适用于不同场景。
布尔索引(推荐首选)
通过构造布尔条件表达式来筛选满足条件的行,语法直观、可读性强,支持向量化运算,适合复杂逻辑判断。
df[df["age"] > 30]
df[(df.A > 10) & (df.B == "X")]
注意:多个条件需使用括号包裹,并用 &(与)、|(或)、~(非)连接,不可使用 and/or/not。
&
query() 方法(简洁优雅)
使用字符串形式编写筛选条件,代码更清晰,尤其适合多条件组合场景,提升脚本可读性。
df.query("age > 30 and city in ['北京','上海']")
支持变量引用如 @var_name,并能自动忽略缺失值(NaN),避免因空值导致的异常。
in
not in
@变量
==
!=
>
str.contains()
loc(标签索引)
基于行索引的标签进行数据选取,适用于索引具有实际意义(如日期、用户ID等)的情况。
df.loc[df.index.isin(["A001","B002"])]
df.loc["2025-01-01":"2025-01-10"]
支持切片操作,且标签切片包含起始和结束位置(闭区间),即 loc[a:b] 包含 a 和 b 对应的行。
"2025-01-01":"2025-01-10"
iloc(位置索引)
根据整数位置进行选择,不依赖索引名称,稳定性高,特别适用于索引混乱或无业务含义的情形。
df.iloc[5:10]
df.iloc[[0,2,-1]]
切片遵循左闭右开原则,例如 iloc[5:10] 表示选取第 5 至第 9 行(对应位置索引)。
iloc[5:10]
isin(成员判断)
用于判断某列是否属于指定值列表中的元素,常用于实现“白名单”或“黑名单”式过滤。
df[df["sector"].isin(["科技","金融"])]
相比多次使用 == 或 | 拼接条件,isin 更简洁高效。
==
str 方法(字符串列处理)
针对文本类型列,提供丰富的字符串操作方法,可用于前缀、后缀、正则匹配等模糊筛选。
df[df["name"].str.contains("张", na=False)]
df[df["code"].str.startswith("SH")]
使用 .str 访问器时建议配合 na=False 参数防止 NaN 引发错误,同时支持正则表达式功能。
na=False
regex=True
二、按「列」筛选
列筛选主要用于提取感兴趣的字段或按特定规则批量选择变量,便于后续分析或建模准备。
选择单列
可通过点号访问(仅当列名合法且不含空格或特殊字符)或中括号方式获取单列数据。
df["col"]
df.col
返回结果为 Series;若存在重复列名,则返回所有同名列组成的 DataFrame。
Series
DataFrame
选择多列
传入列名列表即可一次性选取多个字段,顺序可自定义,返回 DataFrame 类型。
df[["A","C","E"]]
该方法灵活度高,常用于特征工程阶段的变量子集抽取。
DataFrame
正则匹配列名
利用 filter() 函数结合正则表达式筛选符合命名模式的列,例如提取所有以 price 或 amount 开头/结尾的字段。
df.filter(regex="^price|^amount$")
适用于大规模数据集中快速定位相关变量。
按数据类型筛选
使用 select_dtypes() 可按数据类型(如数值型、对象型、时间型)分类选取列。
df.select_dtypes(include=["number"])
df.select_dtypes(exclude="object")
常用于预处理阶段分离不同类型变量,分别做标准化、编码或填充处理。
按缺失值比例筛选
剔除缺失率过高(如 ≥50%)的列,减少噪声影响,提高模型鲁棒性。
df.loc[:, df.isnull().mean() < 0.5]
三、按「行列组合」筛选(高级定位)
结合行与列的条件进行精确数据定位,适用于需要精准提取子集的复杂场景。
loc[行条件, 列名]
推荐使用的组合筛选方式,支持布尔索引与列名列表搭配,安全高效。
df.loc[df.age > 30, ["name","salary"]]
iloc[行位置, 列位置]
完全基于整数位置的双维索引,底层机制稳定,不受索引标签干扰。
df.iloc[0:5, [1,3,4]]
at / iat(标量最快访问)
专为单个单元格取值设计,at 基于标签,iat 基于位置,性能远超普通索引(快 2–5 倍)。
df.at["A001", "salary"]
df.iat[0, 2]
但仅限单值访问,不能用于切片赋值或批量操作。
loc/iloc
四、高频错误与避坑指南(必看!)
以下是在实际使用中极易出现的问题及其正确应对策略。
列名不存在 / 大小写/空格/中文全角问题
常见于读取外部文件时未检查原始列名格式。
KeyError: 'col'
解决方案:打印 df.columns 查看真实列名,必要时使用字符串清洗方法统一格式。
df.columns.tolist()
df.columns.str.strip().str.lower()
链式赋值警告(SettingWithCopyWarning)
直接对子集进行修改可能触发副本问题,导致赋值无效。
SettingWithCopyWarning
正确做法:使用 loc 一步完成定位与赋值,避免两步切片操作。
df[df.A>1]["B"] = 0
.loc
df.loc[df.A>1, "B"] = 0
ValueError: Cannot index with multidimensional key
两步切片引发视图/副本问题
连续使用中括号可能导致中间生成视图或副本,进而无法正确修改原数据。
df[布尔数组][["col"]]
建议始终采用 loc[row_cond, col_list] 一次性完成行列筛选。
df.loc[布尔数组, ["col"]]
TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]
列中含 NaN 导致条件判断报错
部分方法在遇到空值时会抛出异常,尤其是字符串或数学运算操作。
df.col == x
解决方式包括使用 dropna() 预先清理、fillna() 替换默认值,或添加 na=False 参数控制行为。
NA
df.col.eq(x)
df.col.fillna(0) == x
na=False
str.contains(..., na=False)
布尔条件 Series 的 index 与 df 不一致
当条件来自另一个 DataFrame 或经过重采样、聚合后,其索引可能与目标 df 不对齐。
IndexingError: Unalignable boolean Series
应使用 .values 提取数组值,或通过 reindex() 显式对齐索引,确保匹配准确。
.values
df[df_other.flag.values]