python pandas中的ix,loc和iloc

本文介绍了Python pandas库中DataFrame的ix, loc和iloc三种数据选择方法。ix是混合索引和位置定位,loc是纯标签定位,而iloc是纯位置定位。在使用时,推荐使用df.loc[:,'one']来修改行/列,df.loc['a','one']来修改特定元素,避免使用可能返回不确定性的df['one']或df['a']['one']。" 131453289,1467541,从飞机发明看预先要求与必然结果:人工智能的理论根基,"['科学基础', '技术发展', '历史案例', '人工智能理论', '数据模型']

环境:python 3.4 + pandas 0.19.1

先看一下官方文档对这3个api的描述:

  • DataFrame.ix
    • A primarily label-location based indexer, with integer position fallback.【支持根据索引值,或者按顺序位置定位】
    • .ix[] supports mixed integer and label based access. It is primarily label based, but will fall back to integer positional access unless the corresponding axis is of integer type.【按顺序位置定位,要求索引不能是数字】
  • DataFrame.loc
    • Purely label-location based indexer for selection by label.【按索引值定位】
    • .loc[] is primarily label based, but may also be used with a boolean array.
  • DataFrame.iloc
    • Purely integer-location based indexing for selection by position.【按顺序位置定位】
    • .iloc[] is primarily integer position based (from 0 to length-1 of the axis), but may also be used with a boolean array.
然后在一个函数中需要对DF进行修改,使用了iloc,但是用的是交叉的方式(df.iloc[1, 'col1'],index使用位置,column使用了索引值),结果发现修改没有生效,报出了警告:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
里面提到“When setting values in a pandas object, care must be taken to avoid what is called chained indexing. ”,具体详细内容参见链接,不细讲。简单说一下结论:当需要修改pandas的对象时(Series/DataFrame),以如下规则(对ix/loc/iloc一样):
  • 应该使用的方法:df.loc[:,'one'](修改行/列),df.loc['a', 'one'](修改具体某个元素);
  • 不应使用的方法:df['one'](修改行/列),df['a']['one']、df.loc['a']['one'](修改具体某个元素)。(因为这些方法可能返回的是copy,也可能不是,具有不确定性)

<think> 我们被要求回答关于pandaslociloc的使用方法、区别及应用场景。根据提供的引用,我们可以总结如下: 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'`包含ac) | 不包含结束位置(如`0:2`选择01) | | 传递列表 | 标签列表 | 整数位置列表 | | 布尔索引 | 支持 | 支持 | | 多级索引 | 支持(如引用[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,即01),列位置0至2(不包含2,即01),即2行2列。 ### 3. 应用场景 - **loc**:当你知道行或列的标签时使用。例如,按姓名选取行,按列名选取列。尤其在使用自定义索引(非整数索引)时,loc非常方便。 - **iloc**:当你知道行或列的具体位置(即第几行第几列)时使用。例如,选取第0行、第2行第4行,以及第1列第3列。在需要按位置抽取数据(如前100个样本)时常用。 ### 总结 - 使用`loc`时,索引器是标签,切片包含两端。 - 使用`iloc`时,索引器是整数位置,切片不包含结束位置(与Python列表切片一致)。 - 由于`ix`已被弃用,应避免使用,转而使用`loc``iloc`[^4]。 通过正确使用这两种索引方法,可以高效地操作DataFrame中的数据。 §§相关问题§§ 1. 在多层索引(MultiIndex)的DataFrame中,lociloc的用法有什么不同? 2. 使用lociloc时如何处理布尔索引? 3. 为什么在pandas中要区分lociloc两种索引方式? 4. 如何避免在使用lociloc时出现`SettingWithCopyWarning`警告? </think> ### Pandaslociloc详解 #### 一、核心区别 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**。当索引为整数时,优先确认是否需要标签语义(如时间序列序号)再选择方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值