全部版块 我的主页
论坛 金融投资论坛 六区 CFA、CVA、FRM等金融考证论坛 CFA学习群组
80 0
2025-12-09

一、按「行」筛选(最常用)

在 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]
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群