Pandas的 loc iloc ix 区别

  1. import pandas as pd    
  2. data = [[1,2,3],[4,5,6]]    
  3. index = [0,1]    
  4. columns=['a','b','c']    
  5. df = pd.DataFrame(data=data, index=index, columns=columns)    
  6.   
  7. 1. loc——通过行标签索引行数据  
  8. df.loc[1]    
  9. '''''''  
  10. a    4  
  11. b    5  
  12. c    6  
  13. '''    
  14.   
  15. 1.2 loc[‘d’]表示索引的是第’d’行(index 是字符)  
  16. import pandas as pd    
  17. data = [[1,2,3],[4,5,6]]    
  18. index = ['d','e']    
  19. columns=['a','b','c']    
  20. df = pd.DataFrame(data=data, index=index, columns=columns)    
  21. df.loc['d']    
  22. '''''''  
  23. a    1  
  24. b    2  
  25. c    3  
  26. '''    
  27.   
  28. 1.3 如果想索引列数据,像这样做会报错  
  29. print df.loc['a']    
  30. '''''''  
  31. KeyError: 'the label [a] is not in the [index]'  
  32. '''    
  33.   
  34. 1.4 loc可以获取多行数据  
  35. print df.loc['d':]    
  36. '''''''  
  37.    a  b  c  
  38. d  1  2  3  
  39. e  4  5  6  
  40. '''    
  41.   
  42. 1.5 loc扩展——索引某行某列  
  43.   
  44. print df.loc['d',['b','c']]    
  45. '''''''  
  46. b    2  
  47. c    3  
  48. '''    
  49.   
  50. 1.6 loc扩展——索引某列  
  51.   
  52. print df.loc[:,['c']]    
  53. '''''''  
  54.    c  
  55. d  3  
  56. e  6  
  57. '''    
  58.   
  59. 当然获取某列数据最直接的方式是df.[列标签],但是当列标签未知时可以通过这种方式获取列数据。  
  60.   
  61. 需要注意的是,dataframe的索引[1:3]是包含1,2,3的,与平时的不同。  
  62.   
  63. 2. iloc——通过行号获取行数据  
  64.   
  65. 2.1 想要获取哪一行就输入该行数字  
  66.   
  67. df.iloc[1]    
  68. '''''''  
  69. a    4  
  70. b    5  
  71. c    6  
  72. '''    
  73.   
  74. 2.2 通过行标签索引会报错  
  75.   
  76. print df.iloc['a']    
  77. '''''''  
  78. TypeError: cannot do label indexing on <class 'pandas.core.index.Index'> with these indexers [a] of <type 'str'>  
  79. '''    
  80.   
  81. 2.3 同样通过行号可以索引多行  
  82.   
  83. df.iloc[0:]    
  84. '''''''  
  85.    a  b  c  
  86. d  1  2  3  
  87. e  4  5  6  
  88. '''    
  89.   
  90. 2.4 iloc索引列数据  
  91.   
  92. df.iloc[:,[1]]    
  93. '''''''  
  94.    b  
  95. d  2  
  96. e  5  
  97. '''    
  98.   
  99. 3. ix——结合前两种的混合索引  
  100.   
  101. 3.1 通过行号索引  
  102.   
  103. df.ix[1]    
  104. '''''''  
  105. a    4  
  106. b    5  
  107. c    6  
  108. '''    
  109.   
  110. 3.2 通过行标签索引  
  111.   
  112. df.ix['e']    
  113. '''''''  
  114. a    4  
  115. b    5  
  116. c    6  
  117. '''    
<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'`包含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中,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**。当索引为整数时,优先确认是否需要标签语义(如时间序列序号)再选择方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值