详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据


Posted in Python onDecember 13, 2020

pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称。这样内部数据抽取既可以用“行列名称(对应.loc[]方法)”,也可以用“矩阵下标(对应.iloc[]方法)”两种方式进行。
下面具体说明:

(以下程序均在Jupyter notebook中进行,部分语句的print()函数省略)

首先生成一个DataFrame对象:

import pandas as pd
score = [[34,67,87],[68,98,58],[75,73,86],[94,59,81]]
name = ['小明','小红','小李']
course = ['语文','数学','英语','政治']
mydata1 = pd.DataFrame(data=score,columns=name,index=course)#指定行名(index)和列名(columns)
print(mydata1)
mydata2 = pd.DataFrame(score)#不指定行列名,默认使用0,1,2……
print(mydata2)
#指定行列名
  小明 小红 小李
语文 34 67 87
数学 68 98 58
英语 75 73 86
政治 94 59 81
#采用默认行列名
  0  1  2 (默认列名)
0 34 67 87
1 68 98 58
2 75 73 86
3 94 59 81

DataFrame对象生成时除了必须指定data参数外,用户还可以指定两个参数columns(列名)和index(行名,注意这里的index不仅可以是数字,也可以是用户指定的任何数据类型,如字母),如果不指定,则行列名默认都采用0、1、2……。

下图说明了前面的情况:

详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

DataFrame对象的.loc[]和.iloc[]方法都可用于抽取数据,区别是:

  • .loc[]:是location,以columns(列名)和index(行名)作为参数。
  • .iloc[]:是index location,以二维矩阵的位置指标(即0,1,2……)作为参数。

.loc[]语法

.loc[行标签名/[行标签名list],列标签名/[列标签名list]],即有两个输入参数,第一个指定行名,第二个指定列名。当只有一个参数时,默认是行名(即抽取整行),所有列都选中。

.iloc[]语法

.loc[行位置/[行位置list],列位置/[列位置list]],也有两个输入参数,第一个指定行位置,第二个指定列位置。当只有一个参数时,默认是行位置(即抽取整行),所有列都选中。

例1.抽取1行数据

#以下用.loc[]抽取1行名为‘语文'的数据(包括所有列)
mydata1.loc['语文']
mydata1.loc['语文',]
mydata1.loc['语文',:]
mydata1.loc[['语文'],]
mydata1.loc[['语文'],:]
#以下用.iloc[]抽取1行名为‘语文'的数据(包括所有列)
mydata1.iloc[0]
mydata1.iloc[0,]
mydata1.iloc[0,:]
mydata1.iloc[[0],]
mydata1.iloc[[0],:]

#输出方式1(第1个参数无[],这是一个Series对象):
小明  34
小红  67
小李  87
Name: 语文, dtype: int64
#输出方式2(第1个参数有[],这是一个DataFrame对象):
  小明 小红 小李
语文 34 67 87
Name: 语文, dtype: int64

上述.loc[]和.iloc[]都只接收了1个参数“语文”或者“0”,因此默认都表示行信息,而列则全部被选中,即抽取'语文'这整一行数据。','表示将两个参数隔开(如果有两个参数的话),':'这里表示选择中所有列。当只有一个输入参数时,python默认','和':'既可写上也可省略。注意:参数['语文']或[0]中只有一个对象时(即只有一行),[]也可以省略,如果有多个对象(即多行)则必须加上[]。此外还需注意,加上[]表示抽取的结果无论是一个数据,一行数据,还是一列数据,他都是DataFrame对象;不加[]时,如果选中的是一行或者一列数据,则是Series对象,如果是一个单独的数据,则是该数据本身的类型。

例2.指定行名抽取任意多行数据

#指定多行行名抽取
mydata1.loc[['英语','语文','政治'],:]
  小明 小红 小李
英语 75 73 86
语文 34 67 87
政治 94 59 81
mydata1.iloc[[1,0],:]
  小明 小红 小李
数学 68 98 58
语文 34 67 87

例2和例1唯一的差别是,第一个参数指定了多行一起输出,此时必须用[]将各行名或者下标括起来,否则出错。后面的','和':'同例1,可省略。注意:原始数据的行顺序是:语文、数学、英语、政治,这里的提取顺序是['英语','语文','政治'],而输出也是'英语','语文','政治',可见输出顺序和参数指定顺序是一致的,而非按原始顺序输出。

例3.抽取连续任意多行数据

mydata1.loc['语文':'英语',:] #连续抽取从语文到英语的所有行
  小明 小红 小李
语文 34 67 87
数学 68 98 58
英语 75 73 86

mydata1.loc[:'英语',:] #连续抽取从第1行到英语的所有行
  小明 小红 小李
语文 34 67 87
数学 68 98 58
英语 75 73 86

mydata1.iloc[0:3,:] #连续抽取1~3行
  小明 小红 小李
语文 34 67 87
数学 68 98 58
英语 75 73 86

mydata1.iloc[1:,:] #连续抽取第2行最后一行
  小明 小红 小李
数学 68 98 58
英语 75 73 86
政治 94 59 81

例3依然是接受1个参数,列参数没有,后面的','和':'同例1,可省略。连续参数用‘start:end'的方式指定行范围。注意:这里不能用[]将其括起来,否则出错。此外用行列名连续取值时,比如['语文':'政治']会把'政治'所在行也取出来,而利用矩阵下标时,0:3只取0,1,2对应的三行,最后一行不会取出;但是如果行列标签名本身就是整数0,1,2……,而不是文字或者其他类型,那么在使用连续行列标签名取数据时,最后一行或者列是不会被取出的。

例4.抽取“列”的各种情况

mydata1.loc[:,['小红']] #所有行,小红列,只有一列时,内部[]也可以省略
  小红
语文 67
数学 98
英语 73
政治 59

mydata1.loc[:,['小明','小红']] #所有行,小明和小红两列
  小明 小红
语文 34 67
数学 68 98
英语 75 73
政治 94 59

mydata1.iloc[:,[1,2]] #所有行,第2和第3列
  小红 小李
语文 67 87
数学 98 58
英语 73 86
政治 59 81

mydata1.loc[:,'小明':] #连续抽取从小明列开始到最后一列
  小明 小红 小李
语文 34 67 87
数学 68 98 58
英语 75 73 86
政治 94 59 81

mydata1.iloc[:,:3] #连续抽取从1列开始到第3列
  小明 小红 小李
语文 34 67 87
数学 68 98 58
英语 75 73 86
政治 94 59 81

抽取整列的方式跟抽取整行在参数设置上完全一样。.loc[]和.iloc[]两个方法默认列为第二个参数,因此抽取整列时,都必须带上':,'作为区分前面行参数的‘分隔符',否则出错。

例5.同时抽取指定行和列对应数据

mydata1.loc['语文','小明'] #输入了两个参数,输出语文行小明列,即一个数据
34
<class 'numpy.int64'> #没带[]时,单个数字是这种类型
mydata1.loc[['语文'],['小明']] #输出语文行小明列,即一个数据
  小明
语文 34
<class 'pandas.core.frame.DataFrame'> #带[]时,输出依然是DataFrame对象

mydata1.iloc[1,2] #第2行第3列数据,单个数据
58
<class 'numpy.int64'> #注意没带[]时的输出类型
mydata1.iloc[[1],[2]]
  小李
数学 58
<class 'pandas.core.frame.DataFrame'> #注意带[]时的输出类型

mydata1.loc[['语文','数学'],['小明']] #输出语文数学行,小明列的数据
  小明
语文 34
数学 68

mydata1.iloc[1:,[0,2]] #输出从第2行到最后一行,第1和第3行对应数据
  小明 小李
数学 68 58
英语 75 86
政治 94 81

同时抽取分部行和列的情况,就是把上述单独抽取行和列的方式合并起来用。抽取整个DataFrame对象则是.loc[:,:]或.iloc[:,:],虽然这么做没啥意义。

总结:

(1)DataFrame对象的.loc[,]和.iloc[,]方法用于抽取数据,.loc[,]用行列的标签名作为参数,.iloc[,]用二维矩阵元素的网格下标作为参数。
(2)两个方法都接受两个参数,第一个是“行标签”或者“矩阵行号”,第二个是“列标签”或者“矩阵列号”。
(3)两种方法当只指定一个输入参数时,都默是跟“行”相关,而“列”则全部被选中。如何行和列都需要指定时,中间用“逗号,”隔开,这非常重要,否则出错。
(4)当需要选中所有行的某几列时,行参数可以省略,列参数需要指定,此时列参数前面必须带上“,:”,形如.loc[:,列参数],.iloc[:,列参数]。
(5).loc[,]和.iloc[,]设置了一个还是两个输入参数,关键看有没有“,”将两个参数分开,且要区分逗号是一个参数的内部逗号,还有用于分隔行列参数的逗号。
(6)对于两个参数的概念区分,.loc['语文','数学']这表示输入了两个参数,行参数是‘语文',列参数是‘数学',对于上面的表格而言这是错的,因为没有叫‘数学'的列,应写为[['语文','数学']],即‘数学'也是行参数的一部分,['语文','数学']整体作为一个行参数,这里的逗号不是用以分隔行和列,仅仅是行list里面的逗号。[['语文','数学']]=[['语文','数学'],]=[['语文','数学'],:],都表示只有一个行参数,列全部选中。

到此这篇关于详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据的文章就介绍到这了,更多相关pandas .loc[]、.iloc[]抽取数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python中列表和元祖的使用方法
Apr 25 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
python操作字典类型的常用方法(推荐)
May 16 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
python中多个装饰器的执行顺序详解
Oct 08 Python
python读取目录下最新的文件夹方法
Dec 24 Python
对python中Json与object转化的方法详解
Dec 31 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
Python列表解析操作实例总结
Feb 26 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
pandas抽取行列数据的几种方法
Dec 13 #Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 #Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 #Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 #Python
Pandas DataFrame求差集的示例代码
Dec 13 #Python
pandas实现导出数据的四种方式
Dec 13 #Python
python绘图pyecharts+pandas的使用详解
Dec 13 #Python
You might like
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
php 删除记录实现代码
2009/03/12 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php二维码生成
2015/10/19 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
Python中的map、reduce和filter浅析
2014/04/26 Python
简单介绍Python中的JSON模块
2015/04/08 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
Django URL传递参数的方法总结
2016/08/28 Python
Python自定义简单图轴简单实例
2018/01/08 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
浅谈python中get pass用法
2019/03/19 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Final类有什么特点
2012/04/25 面试题
卫校中专生的自我评价
2014/01/15 职场文书
初中语文教学反思
2014/02/02 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python