详解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改变日志(logging)存放位置的示例
Mar 27 Python
Django中模版的子目录与include标签的使用方法
Jul 16 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
python使用sqlite3时游标使用方法
Mar 13 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
django admin组件使用方法详解
Jul 19 Python
Django实现文件上传下载
Oct 06 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
Python 线程池模块之多线程操作代码
May 20 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中定义网站根目录的常用方法
2010/08/08 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
深入解析PHP中SESSION反序列化机制
2017/03/01 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
Ext 表单布局实例代码
2009/04/30 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
Angular工具方法学习
2016/12/26 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
Bootstrap响应式表格详解
2017/05/23 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
python中global用法实例分析
2015/04/30 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
应届生求职信写作技巧
2013/10/24 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
会计电算化实训报告
2014/11/04 职场文书
委托书的样本
2015/01/28 职场文书
检讨书怎么写
2015/05/07 职场文书
学校百日安全活动总结
2015/05/07 职场文书
干部培训简讯
2015/07/20 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS