数据框和序列结构中都有轴标签,轴标签的信息存储在Index对象中,轴标签的最重要的作用是:

  • 唯一标识数据,用于定位数据
  • 用于数据对齐
  • 获取和设置数据集的子集。

本文重点关注如何对序列(Series)和数据框(DataFrame)进行切片(slice),切块(dice)、如何获取和设置子集。

下表列出数据框最基本的操作及其语法:

一,最基本的选择操作

最基本的选择都是使用中括号[]来实现,但是只能实现单个维度的选择。序列(Series)最基本的选择是使用行标签来选择一个标量值,数据框(DataFrame)最基本的选择是使用列名获得一个序列。对于序列来说,如果行索引是整数,那么轴标签就是整数;对于数据框而言,列的标签通常都是文本类型。

创建一个数据框,用于数据演示:

df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])

从数据框中获取A列的数据:

>>> df["A"]
0 -0.053212
1 0.053226
2 0.768993
3 -0.319555
4 0.671913
5 -1.021473
6 1.304257
7 1.215003
Name: A, dtype: float64

从数据框中选择多个列的数据:

df[["A","B"]]

数据框的一列是一个序列,从序列中获得一个标量值:

>>> s=df["A"]
>>> s[0]
-0.05321219353405595

从序列中选择多行的数据:

s[[0,1]]

二,使用loc 和 iloc来选择数据

索引的选择主要是基于标签的选择和基于位置的选择,对于索引来说,位置序号默认从0开始,到length(index)-1 结束。

对于数据框而言,如果没有填写row_indexer 或 column_indexer,那么表示所有的row或column。在row_indexer和column_indexer中,可以使用连续的标签,比方说,0:4,表示从0到4的一个range,即0、1、2、3,注意不包含4。

1,基于标签的选择

.loc 属性用于基于轴标签选择特定的轴,df是数据框结构:

  • 单个标签:df.loc["row"],  df.loc["row","col"]
  • 多个离散的标签:df.loc[["row1","row2","row3"]],df.loc[["row1","row2","row3"],["col1","col2"]]
  • 连续的标签:df.loc["row0":"row3"],df.loc["row0":"row3","col0":"col3"]
  • 布尔掩码数组,对于数据框,所有的行构成一个序列,每行都对应一个掩码,如果掩码为True,表示选择该行;如果为False,表示忽略该行。同理,数据框中的所有列也构成一个序列,每列都对应一个掩码,如果掩码为True,表示选择该列;如果为False,表示忽略该列。

使用连续的标签,获得数据框的一个切片:

df.loc[0:1]

使用多个离散的标签获得特定的行和列:

df.loc[[0,2],["A","D"]]

2,基于位置的选择

.iloc属性用于基于位置的选择,位置序号从0开始,到轴长(axis length-1)截止:

  • 单个位置
  • 多个离散的位置
  • 连续的位置
  • 布尔掩码数组

跟基于标签的选项相比,只不过把标签换成了位置。

三,布尔掩码索引

布尔操作符是: &, | , ~,分别表示 与、或、非。通过操作符,可以把多个布尔值组合成一个逻辑表达式。

当使用布尔掩码向量来作为索引时,布尔向量的长度必须和索引的长度相同。这就意味着,如果一个序列有5行,那么布尔向量必须有5行;如果一个数据框有6列,那么用于选择列的布尔向量必须有5个元素。

例如,获得列A的数据,获得一个序列,对序列进行逻辑运算,得到一个布尔向量:

df["A"]>0

用布尔向量来过滤数据行,得到基于数据掩码的选择:

df.loc[df["A"]>0,["A","B"]]

使用布尔掩码向量作为行索引,由于行索引有8个,即Range(8),因此,布尔掩码向量必须有8行。df["A"]>0 返回一个布尔向量,是由8个布尔值构成的向量。当元素值是Ture时,表示选择该行;当元素值是False时,表示忽略该行。

也可以对布尔向量进行逻辑运算,比如:

s[(s < -1) | (s > 0.5)]

四,通过可调用的函数来选择数据

数据框和序列的 .loc, .iloc 和 [] 都可以接收一个可调用的函数( callable function)作为索引, 可调用的函数必须只有一个参数,并且参数是序列或数据框,返回的是布尔掩码向量。

举个例子,使用lambda定义函数,下面两个脚本是等价的。

df.loc[lambda df: df['A'] > 0, ["A","B"]]
df.loc[df["A"]>0,["A","B"]]

五,isin函数

判断单个值或多个值是否存在于序列或数据框中,返回的是布尔值掩码,并可以通过掩码来会返回值:

In [157]: s.isin([v1,v2,...])

In [158]: s[s.isin([v1,v2,...])]

六,where函数和mask函数

where()函数接收的参数是布尔掩码,返回的shape跟原始的序列和数据框相同,只不过布尔值为False的元素被设置为NaN,布尔值为True的元素显示为原始值,即,把布尔掩码为False的元素掩蔽。

例如,序列s是df["A"],s>0是一个布尔掩码,下面的代码返回的是一个序列,只不过掩码为False的元素全部为NaN,where()函数的作用是布尔掩码为True的返回,为False的设置为NaN。

s.where(s>0)

mask()函数接收的参数也是布尔掩码,返回的shape跟原始序列或数据框也相同,只不过布尔值为False的元素显示为原始值,而布尔值为True的元素显示为NaN,即,把不二掩码为True的元素掩蔽。

七,query()函数

query()函数可以使用表达式来选择数据框,以简化数据框的查询,比如,以下两段代码返回的结果是相同的,而使用query()函数的代码更简洁:

# 布尔组合
df[(df['a'] < df['b']) & (df['b'] < df['c'])]
df.query('(a < b) & (b < c)') # isin
df[df['a'].isin(df['b'])]
df.query('a in b') # not in
df.query('a not in b')
df[~df['a'].isin(df['b'])] #布尔组合
df.query('a in b and c < d')
df[df['b'].isin(df['a']) & (df['c'] < df['d'])]

在query()函数中,可以使用关键字 index来代替数据框的index属性:

df.query('index < b < c')

在query()函数中,使用 == [] 等价于 in;使用 != [] 等价于 not in

# in
df.query('b == ["a", "b", "c"]')
df[df['b'].isin(["a", "b", "c"])] # not in
df.query('c != [1, 2]')
df.query('[1, 2] not in c')

参考文档:

Indexing and selecting data

Intro Pandas

pandas 学习 第14篇:索引和选择数据的更多相关文章

  1. pandas 学习 第5篇:DataFrame - 访问数据框

    数据框是用于存储数据的二维结构,分为行和列,一行和一列的交叉位置是一个cell,该cell的位置是由行索引和列索引共同确定的.可以通过at/iat,或loc/iloc属性来访问数据框的元素,该属性后跟 ...

  2. pandas 学习 第2篇:Series -(创建,属性,转换和索引)

    序列(Series)是由一组数据(各种NumPy数据类型),以及一组与之相关的数据标签(索引)组成,序列不要求数据类型是相同的. 序列是一个一维数组,只有一个维度(或称作轴)是行(row),在访问序列 ...

  3. pandas 学习 第8篇:Index 对象 - (创建、转换、排序)

    Index对象负责管理轴标签.轴名称等元数据,是一个不可修改的.有序的.可以索引的ndarry对象.在构建Sereis或DataFrame时,所用到的任何数据或者array-like的标签,都会转换为 ...

  4. Pandas 学习 第9篇:DataFrame - 数据的输入输出

    常用的数据存储介质是数据库和csv文件,pandas模块包含了相应的API对数据进行输入和输出: 对于格式化的平面文件:read_table() 对于csv文件:read_csv().to_csv() ...

  5. Python 数据分析 - 索引和选择数据

    loc,iloc,ix三者间的区别和联系 loc .loc is primarily label based, but may also be used with a boolean array. 就 ...

  6. pandas 学习 第7篇:DataFrame - 数据处理(应用、操作索引、重命名、合并)

    DataFrame的这些操作和Series很相似,这里简单介绍一下. 一,应用和应用映射 apply()函数对每个轴应用一个函数,applymap()函数对每个元素应用一个函数: DataFrame. ...

  7. Pandas索引和选择数据

    在本章中,我们将讨论如何切割和丢弃日期,并获取Pandas中大对象的子集. Python和NumPy索引运算符"[]"和属性运算符".". 可以在广泛的用例中快 ...

  8. Pandas | 13 索引和选择数据

    Pandas现在支持三种类型的多轴索引; 编号 索引 描述 1 .loc() 基于标签 2 .iloc() 基于整数 3 .ix() 基于标签和整数 .loc() Pandas提供了各种方法来完成基于 ...

  9. pandas 学习 —— 逻辑表达式与布尔索引

    >> df = pd.DataFrame(np.random.randint(0, 10, (5, 4)), columns=list('ABCD')) A B C D 0 0 4 8 4 ...

随机推荐

  1. 图解HTTP简单笔记【上】

    第一章 了解WEB及网络基础(省略了TCP/IP的知识点) 1.1.使用HTTP协议访问web  当我们在主机的浏览器的地址输入URL之后 请求将回发送至目标服务器 目标服务器在接受到响应请求时将会响 ...

  2. 使用phpExcel读取excel文件

    include_once '../include/common.inc.php'; include_once MC_ROOT.'include/smarty.inc.php'; date_defaul ...

  3. pandas 对时间索引进行分割

    截取最近1个月时间,截取最近一段时间,进行统计分析 df.loc["2016-01-05":"2016-02-05",:].tail() 在index为有序数据 ...

  4. 「CSP-S 2019」括号树

    [题目描述] 传送门 [题解] 是时候讨论一下我在考场上是怎么将这道题写挂的了 初看这道题毫无思路,先看看部分分吧 一条链的情况?设k[i]表示前i个括号的方案数 显然\(k[i]=k[i-1]+\) ...

  5. appium服务器参数

    appium服务器初始化参数 Appium服务器初始化参数(功能) 设置能力 能力参数项 获取appPackage与appActivity 查看当前活动名称 使用uiautomatorviewer定位 ...

  6. 冲刺随笔——Day_Seven

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  7. Spring Boot 实现看门狗功能 (调用 Shell 脚本)

    需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启.程序升级(如果只需要实现自动升级功能可以使用 inotify)等功 ...

  8. sql server full join拼接表数据,按组加序号

    --查询所有数据select A.*,B.* from(select z.id,z.requestId,z.FBillNo,dt5.FCauseAndProcess,dt5.FEquipmentNo, ...

  9. R语言无网络安装R包,彻底解决依赖问题!

    R version: 3.5.3, 3.6.3 更新日期: 2020-9-10 大家测试后多提建议哈, 有问题我会持续更新的 在工作中,我们使用的服务器通常是不能联外网的,这在安装R包的时候产生了巨大 ...

  10. 老猿学5G扫盲贴:中国移动网络侧CHF的功能分解说明

    ☞ ░ 老猿Python博文目录░ 一.引言 在<老猿学5G扫盲贴:中国移动网络侧CHF主要功能及计费处理的主要过程>介绍了中国移动CHF的总体功能,同时说明了CHF网元主要由AGF.CD ...