python的高级技巧:Pandas中的iloc[]和loc[]
iloc[]和loc[]是Pandas中用于数据索引/切片的核心方法,核心区别在于索引依据不同 :iloc基于"整数位置",loc基于"标签(行索引名/列名)"。以下分点对比并结合实例说明:
一、区别对比
| 维度 | iloc[](integer location) |
loc[](label location) |
|---|---|---|
| 索引依据 | 行/列的整数位置(从0开始计数) | 行的索引名 、列的列名(标签) |
| 切片规则 | 左闭右开(如0:2仅包含位置0、1) |
包含终点(如'a':'c'包含标签a、b、c) |
| 支持的索引类型 | 整数、整数列表、整数切片、布尔数组 | 标签、标签列表、标签切片、布尔数组 |
| 适用场景 | 按数据的"物理顺序"取数(不管行/列标签) | 按数据的"逻辑标签"取数(依赖行/列的命名) |
注:Pandas 的 "列标签" 和 "行标签" 分别对应 DataFrame.columns 和 DataFrame.index。而机器学习中的 "样本标签"是指样本的目标值(label / 目标变量),二者不同。
二、实例演示(构造带自定义标签的DataFrame)
先创建一个行索引为自定义标签的DataFrame(避免默认整数索引,更易体现区别):
python
import pandas as pd
data = pd.DataFrame(
data={'数学': [90, 85, 78], '英语': [88, 92, 75]},
index=['张三', '李四', '王五'] # 行标签(非默认整数)
)
print("原始DataFrame:")
print(data)
输出:
数学 英语
张三 90 88
李四 85 92
王五 78 75
1. 取单行/单列
-
iloc(按整数位置) :行位置0对应"张三",列位置0对应"数学"pythondata.iloc[0] # 取第1行(位置0) # 输出: # 数学 90 # 英语 88 # Name: 张三, dtype: int64 -
loc(按标签) :直接用行标签"张三"、列名"数学"pythondata.loc['张三'] # 取标签为"张三"的行 # 输出同iloc[0]
2. 取多行/多列(切片)
-
iloc(左闭右开) :0:2仅包含位置0、1(对应"张三""李四")pythondata.iloc[0:2] # 取位置0到2(不含2)的行 # 输出: # 数学 英语 # 张三 90 88 # 李四 85 92 -
loc(包含终点) :'张三':'王五'包含所有标签在"张三"到"王五"之间的行pythondata.loc['张三':'王五'] # 取标签从"张三"到"王五"的行(含王五) # 输出: # 数学 英语 # 张三 90 88 # 李四 85 92 # 王五 78 75
3. 取特定行+列(二维索引)
-
iloc(行位置+列位置) :行位置1(李四)、列位置1(英语)pythondata.iloc[1, 1] # 取第2行(位置1)、第2列(位置1)的值 # 输出:92 -
loc(行标签+列名) :行标签"李四"、列名"英语"pythondata.loc['李四', '英语'] # 取"李四"行、"英语"列的值 # 输出:92
4. 布尔索引(按条件取数)
两者都支持布尔数组,但loc更常用(直接关联标签):
python
# 条件:数学分数>80
mask = data['数学'] > 80
# iloc:先获取满足条件的行位置,再取数
data.iloc[mask.values] # mask.values是布尔数组,对应行位置
# 输出:
# 数学 英语
# 张三 90 88
# 李四 85 92
# loc:直接用布尔数组取数(更直观)
data.loc[mask]
# 输出同iloc
三、注意点
- 若DataFrame用默认整数行索引 (如0、1、2),
iloc[0]和loc[0]结果可能相同,但逻辑本质不同:iloc[0]是"取位置0",loc[0]是"取标签为0的行"; iloc的切片不包含终点 (如0:3取0、1、2),loc的切片包含终点 (如0:3取标签0、1、2、3),这是最易踩坑的差异;- 实际场景中:
- 若需要按"数据的物理顺序"取数(如"前5行"),用
iloc; - 若需要按"行/列的命名"取数(如"取'张三'的成绩"),用
loc。
- 若需要按"数据的物理顺序"取数(如"前5行"),用