.loc 与.iloc

Python中的Pandas库根据位置取值可以用.loc.iloc以及.ix,还可以通过每一行的索引和列的索引,把需要的行和列单独取出来

Pandas详解可以看下面这两篇文章:

十分钟掌握Pandas(上)

十分钟掌握Pandas(下)

 

iloc:根据标签的所在位置,从0开始计数,先选取行再选取列

loc:根据DataFrame的具体标签选取行列,同样是先行标签,后列标签

 

一、当每列已有column name时,用 df [ 'a' ] 就能选取出一整列数据。如果你知道column names 和index,且两者都很好输入,可以选择 .loc

import numpy as np
import pandas as pd
df=pd.DataFrame(np.arange(0,200,2).reshape(10,10),columns=list('abcdefghij'))
print(df)
print (df.loc[[1,5],['a','b']])

输出了完整的df,以及第1行和第5行且column name为a和b的数据,由于没有命名index,所以数字0-9是DataFrame自动赋予的

二、如果column name太长,输入不方便,或者index是一列时间序列,更不好输入。那就可以选择 .iloc了。

import numpy as np
import pandas as pd
df=pd.DataFrame(np.arange(0,200,2).reshape(10,10),columns=list('abcdefghij'))
print (df.iloc[2,1])
print (df.iloc[:5,5])

输出了第2行第1列的数据42,以及index为0-4第6列 f的数据。.iloc 使得我们可以对column使用slice(切片)的方法对数据进行选取。

三、.ix 的功能十分强大,它允许我们混合使用下标和名称进行选取。

df.ix [ [ ..1.. ], [..2..] ],  1框内必须统一,必须同时是下标或者名称,2框也一样。 

import numpy as np
import pandas as pd
df=pd.DataFrame(np.arange(0,200,2).reshape(10,10),columns=list('abcdefghij'))
print (df.ix[[2,3],[1,2]])

但是一般情况下不建议采用。

<think>好的,用户现在想了解关于Pandas中的.loc.iloc方法。首先,我需要回顾用户之前的对话历史,看看他们之前的问题是什么。之前用户询问的是关于如何避免SettingWithCopyWarning,特别是使用.copy(deep=True)来创建独立副本。现在他们转向了数据访问方法,可能需要更深入地理解如何正确使用.loc.iloc来操作DataFrame,以避免之前的警告再次出现。 首先,我应该确定用户对.loc.iloc的了解程度。他们可能已经有一些使用经验,但遇到了问题,比如SettingWithCopyWarning,或者在数据索引时遇到错误。因此,需要解释这两个方法的区别、适用场景以及如何正确使用它们。 接下来,我需要结构化回答,确保清晰明了。通常,用户希望得到对比、示例以及常见问题的解决方案。可能需要分点说明.loc.iloc的不同之处,比如基于标签和基于位置,包含端点否,以及如何处理切片。同时,要给出具体的例子,帮助用户直观理解。 还要考虑到用户可能的错误使用情况,比如混合使用标签和位置索引,或者在链式赋值中导致SettingWithCopyWarning。这时候需要强调使用.loc/.iloc进行单一索引操作的重要性,以避免链式索引的问题,这也是用户之前遇到的警告的原因之一。 此外,用户可能对何时使用.loc.iloc有疑问,所以需要给出选择指南,比如在明确标签时用.loc,需要位置索引时用.iloc,或者在处理时间序列数据时推荐.loc。同时,提到避免在循环中使用它们以提高效率,这也是常见的最佳实践。 最后,要检查回答是否符合用户之前的系统级指令,比如使用正确的中文,数学公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式。结构需要清晰,分点解答,可能使用标题和代码块来增强可读性。 总结一下,回答的结构应该是:简介、核心区别、使用示例、常见问题、选择指南、总结。确保每个部分都有足够的细节和示例,帮助用户彻底理解.loc.iloc的使用方法,从而避免之前的错误,并提高代码的效率和可读性。</think>以下是关于 Pandas 中 `.loc` 和 `.iloc` 的详细介绍,包含核心区别、使用场景和典型示例: --- ### 一、核心区别 | **特性** | `.loc` (Label-based) | `.iloc` (Position-based) | |----------------|------------------------------------------|--------------------------------------| | **索引依据** | **标签名** (行/列的名称) | **整数位置** (行/列的绝对位置) | | **切片端点** | **包含** 结束位置(`start:end` 含 `end`) | **不包含** 结束位置(类似 Python 列表)| | **混合索引** | 允许标签布尔数组结合 | 仅允许整数或布尔数组 | | **适用场景** | 按名称筛选数据(如时间序列) | 按绝对位置快速访问数据 | --- ### 二、使用示例 #### 1. 基础数据 ```python import pandas as pd data = { 'A': [10, 20, 30, 40], 'B': ['X', 'Y', 'Z', 'W'], 'C': [True, False, True, False] } df = pd.DataFrame(data, index=['row1', 'row2', 'row3', 'row4']) ``` #### 2. `.loc` 的典型操作 - **单行单列**: ```python df.loc['row2', 'B'] # 输出 'Y' ``` - **多行多列**: ```python df.loc[['row1', 'row3'], ['A', 'C']] ``` - **切片范围**: ```python df.loc['row1':'row3', 'A':'B'] # 含结束位置 row3 和列 B ``` - **布尔索引**: ```python df.loc[df['A'] > 20, ['B', 'C']] # 筛选 A 列大于20的行 ``` #### 3. `.iloc` 的典型操作 - **单行单列**: ```python df.iloc[1, 0] # 第2行第1列(索引从0开始),输出 20 ``` - **多行多列**: ```python df.iloc[[0, 2], [1, 2]] # 第1、3行,第2、3列 ``` - **切片范围**: ```python df.iloc[0:2, 1:3] # 行0-1(不含2),列1-2(不含3) ``` - **布尔索引**: ```python df.iloc[(df['A'].values > 20).nonzero()[0], :] # 需用 .values 转为数组 ``` --- ### 三、常见问题解决方案 #### 1. **混淆标签位置** ```python # ❌ 错误:用数字索引尝试 .loc df.loc[0, 'A'] # 若索引是字符串(如'row1'),会报错 KeyError # ✅ 正确:用 .iloc 访问位置 df.iloc[0, 0] # 输出 10 ``` #### 2. **链式赋值触发警告** ```python # ❌ 链式索引导致 SettingWithCopyWarning df[df['A'] > 20]['C'] = True # 分两步操作 # ✅ 正确:用 .loc 单步完成 df.loc[df['A'] > 20, 'C'] = True ``` #### 3. **处理多层索引 (MultiIndex)** ```python # 假设 df 有层级索引 df.loc[('row1', 'subrow'), 'A'] # 多层标签访问 df.iloc[0, 0] # 直接按位置访问第一层 ``` --- ### 四、选择 `.loc` 或 `.iloc` 的指南 | **场景** | **推荐方法** | **原因** | |------------------------------|-------------|-----------------------------------| | 明确知道行/列标签名 | `.loc` | 直观且可读性高 | | 需要基于位置快速访问 | `.iloc` | 性能更高(省去标签解析开销) | | 时间序列数据(按日期筛选) | `.loc` | 直接使用日期字符串切片 | | 需要兼容不同顺序的数据 | `.loc` | 不受行/列位置变化影响 | | 循环中按顺序遍历数据 | `.iloc` | 通过 `for i in range(len(df))` 控制 | --- ### 五、性能优化技巧 1. **避免混合使用**:不要在同一操作中混用 `.loc` 和 `.iloc` 2. **向量化操作优先**:尽量用 `df['col'] = ...` 替代逐元素修改 3. **预先转换索引**: ```python row_pos = df.index.get_loc('row2') # 获取标签对应的位置 df.iloc[row_pos, 1] = 'New Value' ``` --- ### 六、总结 - **`.loc`**:面向标签,适合**明确知道数据名称**的场景(如 `日期、ID`) - **`.iloc`**:面向位置,适合**按绝对顺序访问**的场景(如 `矩阵计算`) - **核心原则**:保持索引方式一致性,避免链式操作,优先使用单步赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值