在Pandas中,loc
和iloc
是用于DataFrame和Series数据选择的两种核心方法,本质区别在于索引方式:loc
基于标签(label),而iloc
基于整数位置(integer position)。以下是详细对比及用法说明:
📌 核心区别总结
特性 | loc | iloc |
---|---|---|
索引类型 | 标签(字符串、日期等) | 整数位置(从0开始) |
切片行为 | 闭区间(包含结束标签) | 开区间(不包含结束位置) |
支持索引 | 标签、布尔数组、条件表达式 | 整数、整数列表/切片、布尔数组(需基于位置) |
适用场景 | 按行/列名称选择、条件筛选 | 按物理位置选择(如第n行/列) |
🔍 详细功能与示例
1. loc
:基于标签的索引
- 选择单行/单列:
df.loc['a'] # 选择标签为'a'的行 df.loc[:, 'Age'] # 选择列名为'Age'的所有行
- 多行多列选择:
df.loc[['a', 'c'], ['Name', 'City']] # 选择'a'和'c'行,'Name'和'City'列
- 切片操作(包含结束点):
df.loc['a':'c', 'Name':'City'] # 从'a'到'c'行,'Name'到'City'列(含'c'和'City')
- 布尔索引(条件筛选):
df.loc[df['Age'] > 30] # 筛选Age>30的行 df.loc[df['City'].isin(['New York'])] # 筛选City为纽约的行
2. iloc
:基于位置的索引
- 选择单行/单列:
df.iloc[0] # 第1行(位置0) df.iloc[:, 1] # 第2列(位置1)
- 多行多列选择:
df.iloc[[0, 2], [0, 2]] # 第1行和第3行,第1列和第3列
- 切片操作(左闭右开):
df.iloc[0:2, 1:3] # 第1-2行(不含第2行),第2-3列(不含第3列)
- 布尔索引(需结合位置):
mask = (df['Age'] > 30).values # 生成布尔数组并转换为位置索引 df.iloc[mask] # 选择满足条件的行
⚠️ 关键注意事项
- 切片区间差异:
loc['a':'c']
包含标签'a'
、'b'
、'c'。
iloc[0:2]
仅包含位置0和1(不包含2)。
- 索引灵活性:
loc
可处理非整数标签(如字符串索引)。iloc
仅支持整数位置,与DataFrame的索引标签无关。
- 布尔索引区别:
loc
可直接用列条件(如df['A'] > 0
)。iloc
需将布尔数组转换为位置索引(如.values
)。
💡 何时选择哪种方法?
- 用
loc
当:
✅ 需按行/列名称(如日期、ID)访问数据;
✅ 需包含结束点的切片(如时间范围);
✅ 需直接使用列条件筛选数据。 - 用
iloc
当:
✅ 需按物理位置选择(如前5行、第2列);
✅ 数据索引无明确业务含义(如纯数字索引);
✅ 需与NumPy类似的整数位置操作兼容。
🌰 场景示例
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['NY', 'LA', 'Chicago']}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
# loc示例:选择'a'到'b'行,'Name'列(包含'b')
df.loc['a':'b', 'Name'] # 输出:a→Alice, b→Bob
# iloc示例:选择前2行,第1列(位置0)
df.iloc[0:2, 0] # 输出:a→Alice, b→Bob(不包含第2行)
💡 提示:若索引重复,
loc
会返回所有匹配标签的行,此时可用.reset_index()
重置索引。
掌握两者差异,可更高效精准地操作Pandas数据结构!