pandas之用loc、iloc、ix进行索引以及切片

本文详细解析了Pandas中DataFrame的三种主要索引方式:loc、iloc和ix,包括它们的适用场景、语法特点及常见错误。通过实例对比,帮助读者深入理解并正确使用这些索引方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

虽然用了pandas很长时间了,但是基本也是围绕在用pandas去做一些文件操作以及一些常用功能,每次在用到对DataFrame进行索引时都习惯了数组的 [] 索引方式,所以在使用DataFrame索引时,我都比较习惯于将DataFrame先转换为二维数组,然后以数组的方式进行索引,因为对DataFrame用 [] 进行索引时经常会有一些易错点,而用loc、iloc时,老是忘记它们的适用范围,所以感觉有必要整理一下它们的用法和关系了。

准备

下面还是以之前的数据来进行各种索引方式的演示:

df = pd.read_csv('./data.csv')
print(df)

      Name  Gender  Age  Score   id
0     Alen    Male   18     80  id0
1      Bob    Male   19     90  id1
2     Cidy  Female   18     93  id2
3   Daniel    Male   20     87  id3
4    Ellen  Female   17     96  id4
5  Frankie    Male   21    100  id5
6     Gate    Male   20     88  id6
7     Hebe  Female   22     98  id7
loc

loc是通过行(列)标签索引行(列)数据
由于是按照行/列标签进行索引数据,所以这里我们先设置行数据的索引标签:

df = df.set_index('id')
print(df)

       Name  Gender  Age  Score
id                              
id0     Alen    Male   18     80
id1      Bob    Male   19     90
id2     Cidy  Female   18     93
id3   Daniel    Male   20     87
id4    Ellen  Female   17     96
id5  Frankie    Male   21    100
id6     Gate    Male   20     88
id7     Hebe  Female   22     98

下面按照行列标签进行索引:
像下面的按照单行索引,切片索引都是没有问题的,区别只是在于返回的结果是SeriesDataFrame或者是其他对象。

print(df.loc['id0'])        # return NoneType Object
print(df.loc['id0', 'Name'])   # return str
print(df.loc['id0':'id4'])     # return DataFrame Object
print(df.loc['id0':'id4', ['Name', 'Age', 'Score']])    # return DataFrame Object
print(df.loc[:, 'Name'])    # return Series Object

Name      Alen
Gender    Male
Age         18
Score       80
Name: id0, dtype: object

Alen

       Name  Gender  Age  Score
id                             
id0    Alen    Male   18     80
id1     Bob    Male   19     90
id2    Cidy  Female   18     93
id3  Daniel    Male   20     87
id4   Ellen  Female   17     96

       Name  Age  Score
id                     
id0    Alen   18     80
id1     Bob   19     90
id2    Cidy   18     93
id3  Daniel   20     87
id4   Ellen   17     96

id
id0       Alen
id1        Bob
id2       Cidy
id3     Daniel
id4      Ellen
id5    Frankie
id6       Gate
id7       Hebe
Name: Name, dtype: object

但是如果按照下面的方式索引,则都会报错:

print(df.loc[0])
print(df.loc[0, 0])
print(df.loc[0:4, 0])
print(df.loc[0:4, 0:2])

Error
iloc

iloc是按照行(列)号进行索引行(列)数据
当没有设置行索引的标签时:

df = pd.read_csv('./data.csv')
print(df)

      Name  Gender  Age  Score   id
0     Alen    Male   18     80  id0
1      Bob    Male   19     90  id1
2     Cidy  Female   18     93  id2
3   Daniel    Male   20     87  id3
4    Ellen  Female   17     96  id4
5  Frankie    Male   21    100  id5
6     Gate    Male   20     88  id6
7     Hebe  Female   22     98  id7

此时再通过上面报错的行号和列号方式进行索引数据时就不会出错了:

print(df.iloc[0])
print(df.iloc[0, 0])
print(df.iloc[0:4, 1])
print(df.iloc[0:4, 0:2])

Name      Alen
Gender    Male
Age         18
Score       80
id         id0
Name: 0, dtype: object

Alen

0      Male
1      Male
2    Female
3      Male
Name: Gender, dtype: object

     Name  Gender
0    Alen    Male
1     Bob    Male
2    Cidy  Female
3  Daniel    Male

ix

ix是loc和iloc两者的结合,但是官方为了让loc和iloc各尽其职,所以即将废弃ix,所以这里也不建议使用ix。.ix is deprecated. Please use.loc for label based indexing or .iloc for positional indexing

其他索引方式

其他的索引方式就是按照我之前的习惯,将DataFrame转换为一个numpy二维数组,然后通过数组的方式进行索引。

arr = df.values
# mat = df.as_matrix()
print(arr[0])
print(arr[0:4, 2:4])

['Alen' 'Male' 18 80 'id0']
[[18 80]
 [19 90]
 [18 93]
 [20 87]]

其中df.as_matrix()已经废弃,取而代之的是df.values

总结

对于DataFrame进行索引,建议的方式还是采用iloc和loc,因为得到的DataFrame或者Series对象其中有很多内置函数,便于数据分析。

区分两者的关系时,可以根据行是否有标签索引,如果有例如ID、时间之类的标签就用loc,如果没有指定行标签,那就用iloc。

记忆的时候可以这样辅助记忆,行没有标签时,那就给它加上一个标签iloc(index+loc)。

### Pandas 中 `loc` 和 `iloc` 的区别及用法 #### 一、基本概念 `loc` 是基于标签索引的访问器,用于按照行和列的名称进行数据选取[^5]。而 `iloc` 则是基于位置索引的访问器,主要用于按照整数位置来获取数据[^4]。 #### 二、具体差异 1. **索引方式** - 使用 `loc` 进行切片操作时,其起始和结束边界均会被包含在返回的结果中。 - 而使用 `iloc` 进行切片时,遵循 Python 原生列表切片规则,即左闭右开区间[^4]。 2. **适用范围** - 当 DataFrame 或 Series 对象具有非连续或者自定义的索引(如字符串或其他类型的标签)时,推荐使用 `loc` 来实现精确匹配[^5]。 - 如果需要依赖于固定的位置编号而非实际标签来进行定位,则应选用 `iloc` 方法。 3. **错误处理** 尝试利用 `loc` 访问不存在的数值型行号可能会引发异常,例如尝试执行如下语句会抛出TypeError错误:`data2.loc[1:3]`[^3]。这是因为当指定范围内存在无法解析成有效标签的内容时,系统将拒绝完成该请求并报告相应提示信息。 #### 三、实例演示 下面通过一段简单的代码展示如何分别运用这两种技术手段: ```python import pandas as pd # 创建一个示例 DataFrame data = pd.DataFrame({ 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9] }, index=['row1', 'row2', 'row3']) print("原始数据:") print(data) # 使用 loc 获取特定行列的数据 result_loc = data.loc['row1':'row2', 'A':'B'] print("\n使用 loc 结果:") print(result_loc) # 使用 iloc 获取相同区域的数据 result_iloc = data.iloc[:2, :2] print("\n使用 iloc 结果:") print(result_iloc) ``` 以上程序片段展示了对于同一个目标子集的选择过程可以采用两种不同机制达成一致效果的情况。 #### 四、总结说明 综上所述,在日常数据分析工作中合理选择合适的工具能够极大地提高工作效率以及减少潜在风险。鉴于官方已宣布废弃 `.ix` 属性转而支持更清晰明确的功能划分——即由`.loc`负责基于标签的操作;同时交予`.iloc`承担依据绝对位序的任务安排—因此熟悉掌握这两者的特性及其应用场景显得尤为重要[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值