Pandas笔记 · DataFrame.loc()和DataFrame.iloc()
Posted bluishglc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas笔记 · DataFrame.loc()和DataFrame.iloc()相关的知识,希望对你有一定的参考价值。
文章目录
在介绍DataFrame的数据结构时,我们解释过label
和position
两个概念,这两个概念和loc()
与iloc()
两个操作息息相关。所以,在介绍这两个操作之前,我们再简单复习一下label
和position
:
label
: 对DataFrame的列或行(Index)的名称统称为labelposition
: 对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.DataFrame.loc好慢,怎么遍历访问DataFrame比较快
python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引