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


Posted in Python onMarch 09, 2020

Pandas库十分强大,但是对于切片操作iloc, loc和ix,很多人对此十分迷惑,因此本篇博客利用例子来说明这3者之一的区别和联系,尤其是iloc和loc。

对于ix,由于其操作有些复杂,我在另外一篇博客专门详细介绍ix。

首先,介绍这三种方法的概述:

  • loc gets rows (or columns) with particular labels from the index. loc从索引中获取具有特定标签的行(或列)。这里的关键是:标签。标签的理解就是name名字。
  • iloc gets rows (or columns) at particular positions in the index (so it only takes integers). iloc在索引中的特定位置获取行(或列)(因此它只接受整数)。这里的关键是:位置。位置的理解就是排第几个。
  • ix usually tries to behave like loc but falls back to behaving like iloc if a label is not present in the index. ix通常会尝试像loc一样行为,但如果索引中不存在标签,则会退回到像iloc一样的行为。(这句话有些绕口,没关系,不明白可以看这里)

接下来,举几个例子说明:

1 loc

其实,对于loc始终坚持一个原则:loc是基于label进行索引的!

import pandas as pd
df1 = pd.DataFrame(data= [[1, 2, 3],[4, 5, 6], [7, 8, 9]], index=[0, 1, 2], columns=['a','b','c'])
df2 = pd.DataFrame(data= [[1, 2, 3],[4, 5, 6], [7, 8, 9]], index=['e', 'f', 'g'], columns=['a','b','c'])
print(df1)
print(df2)
'''
df1:
  a b c
0 1 2 3
1 4 5 6
2 7 8 9
df2:
  a b c
e 1 2 3
f 4 5 6
g 7 8 9
'''
 
# loc索引行,label是整型数字
print(df1.loc[0])
'''
a  1
b  2
c  3
Name: 0, dtype: int64
'''
 
# loc索引行,label是字符型
print(df2.loc['e'])
'''
a  1
b  2
c  3
Name: 0, dtype: int64
'''
# 如果对df2这么写:df2.loc[0]会报错,因为loc索引的是label,显然在df2的行的名字中没有叫0的。
print(df2.loc[0])
'''
TypeError: cannot do slice indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [0] of <class 'int'>
'''
 
# loc索引多行数据
print(df1.loc[1:])
'''
  a b c
1 4 5 6
2 7 8 9
'''
 
# loc索引多列数据
print(df1.loc[:,['a', 'b']])
'''
  a b
0 1 2
1 4 5
2 7 8
'''
# df1.loc[:,0:2]这么写报错, 因为loc索引的是label,显然在df1的列的名字中没有叫0,1和2的。
print(df1.loc[:,0:2])
'''
TypeError: cannot do slice indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [0] of <class 'int'>
'''
 
# locs索引某些行某些列
print(df1.loc[0:2, ['a', 'b']])
'''
  a b
0 1 2
1 4 5
2 7 8
'''

2 iloc

其实,对于iloc始终坚持一个原则:iloc是基于position进行索引的!

import pandas as pd
df1 = pd.DataFrame(data= [[1, 2, 3],[4, 5, 6], [7, 8, 9]], index=[0, 1, 2], columns=['a','b','c'])
df2 = pd.DataFrame(data= [[1, 2, 3],[4, 5, 6], [7, 8, 9]], index=['e', 'f', 'g'], columns=['a','b','c'])
print(df1)
print(df2)
'''
df1:
  a b c
0 1 2 3
1 4 5 6
2 7 8 9
df2:
  a b c
e 1 2 3
f 4 5 6
g 7 8 9
'''
# iloc索引行,label是整型数字
print(df1.iloc[0])
'''
a  1
b  2
c  3
Name: 0, dtype: int64
'''
 
# iloc索引行,label是字符型。如果按照loc的写法来写应该是:df2.iloc['e'],显然这样报错,因为iloc不认识label,它是基于位置的。
print(df2.iloc['e'])
'''
TypeError: cannot do positional indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [e] of <class 'str'>
'''
# iloc索引行,label是字符型。正确的写法应该如下:
# 也就说,不论index是什么类型的,iloc只能写位置,也就是整型数字。
print(df2.iloc[0])
'''
a  1
b  2
c  3
Name: e, dtype: int64
'''
 
# iloc索引多行数据
print(df1.iloc[1:])
'''
  a b c
1 4 5 6
2 7 8 9
'''
 
# iloc索引多列数据
# 如果如下写法,报错。
print(df1.iloc[:,['a', 'b']])
'''
TypeError: cannot perform reduce with flexible type
'''
# iloc索引多列数据, 正确写法如下:
print(df1.iloc[:,0:2])
'''
  a b
0 1 2
1 4 5
2 7 8
'''
 
# iloc索引某些行某些列
print(df1.iloc[0:2, 0:1])
'''
  a
0 1
1 4
'''

3 ix

ix的操作比较复杂,在pandas版本0.20.0及其以后版本中,ix已经不被推荐使用,建议采用iloc和loc实现ix。

如有对ix的使用比较感兴趣的朋友可以参考这篇博客。

到此这篇关于详解pandas中iloc, loc和ix的区别和联系的文章就介绍到这了,更多相关pandas iloc loc ix内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python下载文件时显示下载进度的方法
Apr 02 Python
python实现折半查找和归并排序算法
Apr 14 Python
Python之Web框架Django项目搭建全过程
May 02 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
python解决字符串倒序输出的问题
Jun 25 Python
python实现自动登录后台管理系统
Oct 18 Python
Django2.1.3 中间件使用详解
Nov 26 Python
Python二进制文件读取并转换为浮点数详解
Jun 25 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
Python 如何实现数据库表结构同步
Sep 29 Python
pandas中ix的使用详细讲解
Mar 09 #Python
Python unittest 自动识别并执行测试用例方式
Mar 09 #Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 #Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 #Python
python shell命令行中import多层目录下的模块操作
Mar 09 #Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 #Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 #Python
You might like
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Mac 上切换Python多版本
2017/06/17 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
一个SQL面试题
2014/08/21 面试题
个人职业生涯规划书1500字
2013/12/31 职场文书
安卓程序员求职信
2014/02/28 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
在职证明书模板
2015/06/15 职场文书
素质教育培训心得体会
2016/01/19 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL