<think>
我们被要求回答关于pandas中loc和iloc的使用方法、区别及应用场景。根据提供的引用,我们可以总结如下:
1. **loc**:基于标签的索引,即通过行和列的标签名来选取数据。
2. **iloc**:基于整数位置的索引,即通过行和列的位置(从0开始的整数)来选取数据。
引用[1]明确指出:loc是指location的意思,iloc中的i是指integer。引用[4]也提到,官方已经弃用ix,建议使用loc(基于标签)和iloc(基于位置)。
下面我们将详细说明使用方法、区别及典型应用场景。
### 1. 使用方法
#### loc
- 语法:`df.loc[行标签选择, 列标签选择]`
- 选择行时,可以使用单个标签、标签列表、标签切片(包含两端)或布尔数组。
- 选择列时,同样可以使用单个标签、标签列表、标签切片(包含两端)或布尔数组。
- 示例(引用[3]):
```python
data.loc[:, :] # 选取所有行和所有列
```
引用[2]中展示了使用`pd.IndexSlice`进行多级索引的例子:
```python
df1.loc[idx['b','two'], :] # 选取行标签为('b','two')的行,所有列
df1.loc[idx[['b','c'],'one'], 'col2'] # 选取行标签为('b','one')和('c','one'),列标签为'col2'
```
#### iloc
- 语法:`df.iloc[行位置选择, 列位置选择]`
- 选择行时,使用整数位置(从0开始)、整数列表、整数位置切片(不包含结束位置,即左闭右开)或布尔数组。
- 选择列时,同样使用整数位置、整数列表、整数位置切片(不包含结束位置)或布尔数组。
- 示例(引用[3]):
```python
data.iloc[:, :] # 选取所有行和所有列,按位置
```
### 2. 主要区别
| 特性 | loc | iloc |
|--------------|-------------------------------------------|--------------------------------------------|
| 索引类型 | 标签(label-based) | 整数位置(integer position-based) |
| 切片行为 | 包含结束位置(如`'a':'c'`包含a和c) | 不包含结束位置(如`0:2`选择0和1) |
| 传递列表 | 标签列表 | 整数位置列表 |
| 布尔索引 | 支持 | 支持 |
| 多级索引 | 支持(如引用[2]示例) | 支持(但只能使用整数位置) |
引用[5]提供了一个DataFrame示例:
```python
import pandas as pd
data = pd.DataFrame({'a':[0,10,20,30,40], 'b':[1,11,21,31,41], 'c':[2,12,22,32,42]})
```
假设索引为默认整数索引(0,1,2,3,4):
- `data.loc[0:2, 'a':'b']`:选择行标签0至2(包含2),列标签'a'至'b'(包含'b'),即3行2列。
- `data.iloc[0:2, 0:2]`:选择行位置0至2(不包含2,即0和1),列位置0至2(不包含2,即0和1),即2行2列。
### 3. 应用场景
- **loc**:当你知道行或列的标签时使用。例如,按姓名选取行,按列名选取列。尤其在使用自定义索引(非整数索引)时,loc非常方便。
- **iloc**:当你知道行或列的具体位置(即第几行第几列)时使用。例如,选取第0行、第2行和第4行,以及第1列和第3列。在需要按位置抽取数据(如前100个样本)时常用。
### 总结
- 使用`loc`时,索引器是标签,切片包含两端。
- 使用`iloc`时,索引器是整数位置,切片不包含结束位置(与Python列表切片一致)。
- 由于`ix`已被弃用,应避免使用,转而使用`loc`和`iloc`[^4]。
通过正确使用这两种索引方法,可以高效地操作DataFrame中的数据。
§§相关问题§§
1. 在多层索引(MultiIndex)的DataFrame中,loc和iloc的用法有什么不同?
2. 使用loc和iloc时如何处理布尔索引?
3. 为什么在pandas中要区分loc和iloc两种索引方式?
4. 如何避免在使用loc和iloc时出现`SettingWithCopyWarning`警告?
</think>
### Pandas中loc与iloc详解
#### 一、核心区别
1. **索引基础**:
- `loc`:基于**标签(label)** 的索引(行名/列名)
- `iloc`:基于**整数位置(integer position)** 的索引(行号/列号)[^1][^4]
2. **切片行为**:
```python
# loc包含切片终点(闭区间)
df.loc["a":"c"] # 包含a,b,c行
# iloc不包含切片终点(左闭右开)
df.iloc[0:2] # 仅0,1行(不含第2行)
```
#### 二、使用方法
1. **loc操作**:
```python
# 选择单行
df.loc["row_name"]
# 选择行列组合
df.loc["row1":"row3", "colA":"colC"] # 标签切片
# 布尔索引
df.loc[df["age"] > 30, ["name", "city"]]
# 多级索引(示例引用[2])
idx = pd.IndexSlice
df.loc[idx["b":"c", "one"], "col2"]
```
2. **iloc操作**:
```python
# 选择前3行
df.iloc[0:3]
# 选择特定行列位置
df.iloc[[0,2,4], [1,3]] # 第0,2,4行 & 第1,3列
# 全表选择(引用[3])
df.iloc[:, :] # 所有行和列
```
#### 三、典型应用场景
1. **loc适用场景**:
- 按业务ID选取数据(如`df.loc["C001"]`)
- 基于列名筛选字段(如`df.loc[:, ["price","quantity"]]`)
- 使用条件过滤(如`df.loc[df.sales>1000]`)
2. **iloc适用场景**:
- 处理无标签数据集(如csv读取时无列名)
- 按固定位置采样(如`df.iloc[::10]`每10行取1条)
- 机器学习特征矩阵操作(如`X = df.iloc[:, :-1]`)
#### 四、注意事项
1. 避免混用导致错误:
```python
# 错误示例(整数索引 vs 字符串标签)
df.loc[0:2] # 若索引是字符串,报KeyError
df.iloc["a"] # 必定报错,iloc只接受整数
```
2. 官方已弃用`ix`方法,推荐使用`loc`/`iloc`替代[^4]
#### 五、性能建议
- 大数据集优先用`iloc`(整数计算更快)
- 多级索引推荐`loc`+`IndexSlice`[^2]
- 修改数据时注意视图与副本问题:
```python
df.loc["row1"] = 10 # 直接修改原数据
```
> 关键总结:**标签选loc,位置选iloc**。当索引为整数时,优先确认是否需要标签语义(如时间序列序号)再选择方法。