详解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 27 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
python开发之基于thread线程搜索本地文件的方法
Nov 11 Python
python爬取51job中hr的邮箱
May 14 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
python提取包含关键字的整行数据方法
Dec 11 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
python字典一键多值实例代码分享
Jun 14 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
什么是Python变量作用域
Jun 03 Python
python 窃取摄像头照片的实现示例
Jan 08 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
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
python操作redis方法总结
2018/06/06 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
python pytest进阶之fixture详解
2019/06/27 Python
Django在Model保存前记录日志实例
2020/05/14 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
Viking比利时:购买办公用品
2019/10/30 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
大学学风建设方案
2014/05/04 职场文书
消防隐患整改通知书
2015/04/22 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
英语投诉信范文
2015/07/03 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS
java设计模式--建造者模式详解
2021/07/21 Java/Android
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers