非常棒的学习方向!pandas 中的 df.loc 和 df.iloc 是核心操作之一,掌握它们会让你对 DataFrame 的访问、切片、筛选变得得心应手。


✅ 一文透彻理解 df.loc 和 df.iloc 的区别与用法


🔍 本质区别:基于标签 vs 基于位置

属性df.locdf.iloc
访问方式基于标签(label)基于整数位置(index)
支持行标签、列标签行号、列号
包括尾部?是的,切片包含右端否,切片不含右端
是否支持布尔数组✅ 支持✅ 支持

🧪 举个例子:准备数据

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 30, 35, 40],
    'score': [85.5, 90.0, 78.5, 88.0]
}, index=['a', 'b', 'c', 'd'])

print(df)

输出:

   name  age  score
a  Alice   25   85.5
b    Bob   30   90.0
c Charlie   35   78.5
d  David   40   88.0

✳️ 使用 df.loc[]基于标签(index/column 名)

1. 获取单行或多行

df.loc['a']                # 获取标签为 'a' 的那一行
df.loc[['a', 'c']]         # 获取多行

2. 行列同时指定

df.loc['a', 'name']        # 'Alice'
df.loc[['a', 'b'], ['age', 'score']]  # 多行多列

3. 标签切片(含尾)

df.loc['a':'c']            # 获取 a 到 c 行(包含 c 行)

4. 布尔索引

df.loc[df['age'] > 30]     # 获取年龄大于30的行

✳️ 使用 df.iloc[]基于位置(整数编号)

1. 获取第 i 行(0 起)

df.iloc[0]                 # 第 1 行
df.iloc[[0, 2]]            # 第 1 行和第 3 行

2. 行列都用位置

df.iloc[0, 0]              # 第一行第一列 → 'Alice'
df.iloc[1:3, 1:3]          # 行 1 到 2(不含第 3 行),列 1 到 2(不含 3)

3. 布尔数组(适用于行)

df.iloc[[True, False, True, False]]

🎯 常见误区对比

示例.loc 结果.iloc 结果
df.loc['a']第一行,标签为 ‘a’ 的行❌ 报错(不能用标签)
df.iloc[0]❌ 报错(不能用位置)第一行
df.loc[0:2]选标签 0 到 2 行(标签是数字才行)不常用,若 index 是 int 会包含“2”
df.iloc[0:2]❌ 报错正确,选第 0 行和第 1 行

🧠 记忆口诀

📌 .loc[] 是 “L”abel 的缩写 —— 用名字
📌 .iloc[] 是 “I”ndex 的缩写 —— 用数字


🧪 总结速查表

用法lociloc
单行df.loc['a']df.iloc[0]
多行df.loc[['a','b']]df.iloc[[0,1]]
行列df.loc['a', 'age']df.iloc[0, 1]
切片df.loc['a':'c'] ✅ 含末尾df.iloc[0:3] ❌ 不含末尾
布尔df.loc[df['age']>30]df.iloc[[True, False,...]]

🧪 实战建议

  • 若你对行列名字很清楚,用 .loc
  • 若你只是操作某个位置或偏移量,用 .iloc
  • 不要把 .loc[1] 和 .iloc[1] 混用,它们意义完全不同!