Pandas笔记 · DataFrame.loc()和DataFrame.iloc()

Posted bluishglc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas笔记 · DataFrame.loc()和DataFrame.iloc()相关的知识,希望对你有一定的参考价值。

在介绍DataFrame的数据结构时,我们解释过labelposition两个概念,这两个概念和loc()iloc()两个操作息息相关。所以,在介绍这两个操作之前,我们再简单复习一下labelposition

  • label: 对DataFrame的列或行(Index)的名称统称为label
  • position: 对DataFrame的列或行(Index)的排序位置(0,1,2,…)统称为position

相应地:

  • loc(): 基于label(或者是boolean数组)进行数据选择
  • iloc(): 基于position(整数-integer)进行数据选择

iloc()中的i指的是integer,意为integer position的意思。

DataFrame.loc()

DataFrame.loc()支持如下类型的参数:

  • 单一标签,例如:5或’a’(这里的5不是指position,而是一个值为5的index label)
  • 一组标签列表,例如:[‘a’, ‘b’, ‘c’]
  • 一个标签切片,例如:‘a’:‘f’
  • 一个与行/列长度一致的boolean类型的数组
  • 一个能返回上述四种结果的函数(字面量)

注意:以上所有参数都是单一维度的,当loc()只有上述一个参数时,是在行的维度上进行筛选,同时,loc()支持添加一个逗号,再配置一个列维度上的筛选参数。

在演示各种操作之前,我们先构建一个DF出来:

import numpy as np
import pandas as pd

df = pd.DataFrame([[2, 3], [5, 6], [8, 9]],
     index=['cobra', 'viper', 'sidewinder'],
     columns=['max_speed', 'shield'])

在该DF基础上,我们看一下loc()的特种操作。

基于单一标签筛选(行维度)

df.loc['viper']

'viper’是一个标签名,放在第一维度上(没有逗号分割,所以是行维度),因而筛选出的就是(viper,5,6)这一行数据

基于单一标签筛选(行/列两个维度)

我们也可以在行、列两个维度上分别筛选:

df.loc['cobra', 'shield']

这一操作既限定了行是cobra, 列是shield,所以只能筛选出一个cell,就是3。

基于一个标签数组筛选

df.loc[['viper', 'sidewinder']]

这一操作同时筛选了’viper’, 'sidewinder’两行数据。

基于一个切片筛选

df.loc['cobra':'viper', 'max_speed']

这是一个行/列复合条件的筛选,其中在行维度上,使用了slice,从’cobra’行连续选取到’viper’行,在列维度上选取’max_speed’这一列,最终得到了上图的结果集。

基于一个boolean数组筛选

df.loc[[False, False, True]]

这个boolean类型的数组是作用到行维度上的,False意为跳过,不选取,True自然为选取。

如果我们想从列维度上筛选想要的数据列,可以这样写:

df.loc[:, [False,True]]

输出:

	        shield
cobra	    3
viper	    6
sidewinder	9

这一操作的逻辑是:在行维度上通过:操作符全选,然后在列维度上单独选取第二个列。

同样的,我们也可以使用boolean数组在行、列两个维度上同时筛选:

df.loc[[False, False, True], [False,True]]

输出:

	        shield
sidewinder	9

该操作只选取了第三行,第二列。

基于一个函数字面量筛选

df.loc[df['shield'] > 6]

df['shield'] > 6是一个boolean类型的表达式,它返回True或False,因些符合要求,它的筛选逻辑是:选出那些’shield’列的值大于6的所有的行

一个更标准的例子是lambda表达式:

df.loc[lambda df: df['shield'] == 9]

这个lambda表达式(匿名函数)和df['shield'] == 9是等效的。它的筛选逻辑是:选出那些’shield’列的值等于9的所有的行

本节参考文章: https://www.w3resource.com/pandas/dataframe/dataframe-loc.php

DataFrame.iloc()

在理解了DataFrame.loc()之后,DataFrame.iloc()就会变得简单很多,其操作与DataFrame.loc()高度一致,只是它所基于的不是标签,而是Position,是从0开始到lengh-1的位置序号。同样的,DataFrame.iloc()支持如下类型的参数:

  • 一个Position整数,例如:5
  • 一个Position整数数组,例如:[4, 3, 0]
  • 一个Position整数切片,例如:1:7
  • 一个与行/列长度一致的boolean类型的数组
  • 一个能返回上述四种结果的函数(字面量)

在演示各种操作之前,我们先构建一个DF出来:

import numpy as np
import pandas as pd

mydict = ['p': 2, 'q': 3, 'r': 4, 's': 5,
          'p': 200, 'q': 300, 'r': 400, 's': 500,
          'p': 2000, 'q': 3000, 'r': 4000, 's': 5000 ]
df = pd.DataFrame(mydict)

输出:

在该DF基础上,我们看一下iloc()的特种操作。

基于一个Position筛选

df.iloc[0]

输出:

p    2
q    3
r    4
s    5

选取的是第0行数据。

基于一个Position数组筛选

df.iloc[[0, 1]]

输出:

选出的是第0行和第1行数据。

基于一个Position切片筛选

df.iloc[:3]

输出:

选出前3行记录。

基于一个boolean数组筛选

df.iloc[[True, False, True]]

输出:

选出第0行和第2行数据

基于一个函数筛选

df.iloc[lambda x: x.index % 2 == 0]

输出:

选出索引值是偶数的行,所以是0,2两行入选

本节参考文章: https://www.w3resource.com/pandas/dataframe/dataframe-iloc.php

以上是关于Pandas笔记 · DataFrame.loc()和DataFrame.iloc()的主要内容,如果未能解决你的问题,请参考以下文章

Pandas笔记 · DataFrame.loc()和DataFrame.iloc()

Pandas学习笔记,选择多个行或列

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快