详解pandas中iloc, loc和ix的区别和联系

  • Post category:Python

当我们使用 Pandas 进行数据处理和分析时,有时需要通过索引来选取数据。Pandas 提供了三种不同的选取方式,分别是 iloclocix。本文将详细讲解这三种选取方式的区别和联系。

iloc、loc 和 ix 的简介

  • iloc
    iloc 通过整数下标来选取数据。使用时需要指定行和列的下标,或一个切片来获取数据。

  • loc
    loc 根据标签来选取数据。标签可以是其中的任意一个轴(行或列)的名称。

  • ix
    ixilocloc 的混合体。当使用标签选取数据时,ix 使用 loc 的标签查找方式;当使用下标进行数据选取时,ix 使用 iloc 的整数下标选取方式。

详解 iloc、loc 和 ix 的区别和联系

下面将分别从使用方式、基于标签和整数下标选取数据、效率等方面讲解 iloc、loc 和 ix 的不同之处。

使用方式

ilocloc 的使用方式和语法非常相似,只是选取数据的方式不同。其中 iloc 的使用方式如下:

df.iloc[start:end,columns]

其中:

  • start:起始行下标(包括)
  • end:结束行下标(不包括)
  • columns:列下标

loc 的使用方式如下:

df.loc[row_indexer,column_indexer]

其中:

  • row_indexer:用于选择行的值或序列(标签)。
  • column_indexer:用于选择列的值或序列(标签)。

ix 使用的方式有些不同,可以通过标签或整数下标进行选取,因此其使用方式也有些不同:

df.ix[row_indexer, column_indexer]

基于标签和整数下标选取数据

  • 基于标签选取数据

loc 是基于标签进行数据选取的。例如,考虑以下数据框:

import pandas as pd

df = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie'],
                    'score': [90, 80, 70],
                    'gender': ['female', 'male', 'male']})
df.set_index('name', inplace=True)
          score  gender
name                  
Alice       90  female
Bob         80    male
Charlie     70    male

如果我们想选取某个行或列的数据,这时就可以使用 loc。例如,要选取 Alice 行的数据,可以使用以下语句:

df.loc['Alice']
score        90
gender    female
Name: Alice, dtype: object

这里返回的是 Alice 行上的所有数据,可以看到 loc 使用了 name 的标签来获取 Alice 行的数据。

  • 基于整数下标选取数据

iloc 是基于整数下标进行数据选取的。如果我们要选取数据框中的某些行和列,这时可以使用 iloc。例如,要选取第 1 和第 2 行及第 1 列的数据,可以使用以下语句:

df.iloc[[0, 1], [0]]
       score
name        
Alice     90
Bob       80

这里返回的是第 1 和第 2 行及第 1 列的数据。

  • 混合使用标签和整数下标选取数据

ix 具有混合使用标签和整数下标选取数据的能力。例如:

df.ix[[0, 1], ['score']]
       score
name        
Alice     90
Bob       80

这里的第一个参数 [0, 1] 使用了整数下标,表示选取第 1 和第 2 行的数据;而第二个参数 ['score'] 使用了 name 的标签,表示选取 score 列的数据。

效率

在处理大型数据集时,iloc 的速度通常比 loc 快。因此,如果仅需要基于整数下标进行数据选取,则应选择 iloc

当需要同时使用标签和整数下标进行数据选取时,如果可以使用 lociloc 时优先考虑使用它们,而不是使用 ix。这是因为 ix 的效率不如 lociloc 高,特别是在处理大型数据集时。

示例说明

示例一

张三、李四、王五三位同学参加同一场考试,分别取得了 90 分、80 分和 70 分。他们的信息如下:

import pandas as pd

df = pd.DataFrame({ 'name': ['张三', '李四', '王五'],
                    'score': [90, 80, 70],
                    'gender': ['male', 'male', 'male'],
                    'age': [18, 19, 20]})
df.set_index('name', inplace=True)

现在我们要选取第一位同学的分数,可以使用 iloc,也可以使用 loc,如下:

# 使用 iloc
df.iloc[0]['score']

# 使用 loc
df.loc['张三']['score']

两种方法均可得到第一位同学的分数。

示例二

现在有一张数据框,包含了三家医院的医生、科室、工资等信息,如下:

df = pd.DataFrame({ 'hospital': ['hospital1', 'hospital1', 'hospital2', 'hospital2', 'hospital3', 'hospital3'],
                     'doctor': ['doctor1', 'doctor2', 'doctor3', 'doctor4', 'doctor5', 'doctor6'],
                     'department': ['department1', 'department2', 'department1', 'department2', 'department1', 'department2'],
                     'salary': [10000, 12000, 15000, 18000, 13000, 14000]})
df.set_index(['hospital', 'doctor'], inplace=True)

我们要选取医院名称为 hospital2,科室为 department1 的医生的工资,可以使用以下语句:

df.loc[('hospital2', ), 'salary'].loc[:, 'department1']

如果同时使用标签和整数下标选取数据,则可以使用以下第一种语句:

df.ix[['hospital2',], ['salary']][df.ix[['hospital2',], ['salary']]['department'] == 'department1']

或以下第二种语句:

df.loc[pd.IndexSlice['hospital2', :, 'department1'], :]

可以看到,在选取数据时,使用不同的方法会有不同的效率和复杂度。我们需要根据具体情况选择最合适的方法。