数据选择与过滤
本节定位
很多新人第一次学 Pandas 时,最早会卡住的通常不是清洗,而是:
- 我到底怎么把想要的那部分数据挑出来?
所以这节最重要的不是记住所有写法,而是先建立一个判断:
我是按标签取、按位置取,还是按条件筛?
学习目标
- 掌握
loc(标签索引)和iloc(位置索引) - 学会使用布尔索引进行条件过滤
- 掌握
query()方法 - 学会多条件组合筛选
先建立一张地图
数据选择与过滤更适合按“我要选谁”来理解:
所以这节真正想解决的是:
- 不同场景下到底该先想到
loc、iloc还是布尔索引 - 为什么很多
Pandas题的第一步都是“先把要看的数据选出来”
准备示例数据
import pandas as pd
import numpy as np
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五", "赵六", "钱七", "孙八"],
"年龄": [22, 28, 25, 35, 21, 30],
"部门": ["技术", "市场", "技术", "管理", "技术", "市场"],
"薪资": [15000, 18000, 22000, 35000, 12000, 20000],
"入职年份": [2023, 2020, 2021, 2018, 2024, 2019]
})
print(df)
一个更适合新人的总类比
你可以把这一节理解成:
- 在一张很大的表里找你真正要看的那几行几列
也就是说,这节最核心的不是“写法多”,而是:
- 先搞清你是按名字找
- 还是按位置找
- 还是按条件筛
loc:标签索引
loc 用标签(名称) 来定位数据,格式:df.loc[行标签, 列标签]
第一次学 loc,最该先记什么?
最值得先记的是:
loc是按“名字和标签”在选。
也就是说,它更像:
- 我知道我要哪一列、哪一段标签范围
# 取单行
print(df.loc[0]) # 第一行(标签为 0 的行)
# 取多行
print(df.loc[0:2]) # 标签 0 到 2(包含 2!)
# 取特定行和列
print(df.loc[0, "姓名"]) # "张三"
print(df.loc[0:2, "姓名"]) # 前 3 行的姓名
print(df.loc[0:2, ["姓名", "薪资"]]) # 前 3 行的姓名和薪资
# 取所有行的某些列
print(df.loc[:, ["姓名", "年龄"]])
# 条件筛选(最常用!)
print(df.loc[df["年龄"] > 25]) # 年龄大于 25 的所有行
iloc:位置索引
iloc 用位置(整数) 来定位数据,和 Python 列表的切片规则一致:
第一次学 iloc,最该先记什么?
最值得先记的是:
iloc是按“第几行第几列”在选。
所以它更像:
- 你拿着坐标去表里取值
# 取单行
print(df.iloc[0]) # 第一行
# 取多行(不包含末尾!和 Python 一致)
print(df.iloc[0:3]) # 第 0、1、2 行
# 取特定位置
print(df.iloc[0, 0]) # 第 0 行第 0 列 → "张三"
print(df.iloc[0:3, 0:2]) # 前 3 行、前 2 列
print(df.iloc[[0, 2, 4]]) # 第 0、2、4 行
# 取最后一行
print(df.iloc[-1])
loc vs iloc 对比
| 特性 | loc | iloc |
|---|---|---|
| 索引方式 | 标签(名称) | 位置(整数) |
| 切片末尾 | 包含 | 不包含 |
| 示例 | df.loc[0:2] → 3 行 | df.iloc[0:2] → 2 行 |
| 条件筛选 | ✅ 支持 | ❌ 不支持 |
最常见的坑
当索引是默认的 0, 1, 2... 时,loc[0:2] 返回 3 行,iloc[0:2] 返回 2 行。
print(len(df.loc[0:2])) # 3 (包含标签 2)
print(len(df.iloc[0:2])) # 2 (不包含位置 2)
一个很适合初学者先记的选择表
| 你的想法 | 更稳的第一反应 |
|---|---|
| 我知道列名或标签 | loc |
| 我只知道第几行第几列 | iloc |
| 我要按某个条件筛人或筛订单 | 布尔索引 |
| 条件很长、想写得更像一句话 | query() |
这个表很适合新人,因为它会把“到底用哪个”直接变成一个可判断的问题。