详解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 24 Python
Python基于DES算法加密解密实例
Jun 03 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
查看django执行的sql语句及消耗时间的两种方法
May 29 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
python从内存地址上加载python对象过程详解
Jan 08 Python
python输入中文的实例方法
Sep 14 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
Python使用Kubernetes API访问集群
May 30 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 ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
javascript中强制执行toString()具体实现
2013/04/27 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
python实现BackPropagation算法
2017/12/14 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
美国在线珠宝商店:SZUL
2017/02/11 全球购物
元旦晚会邀请函
2014/01/27 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
活动总结新闻稿
2014/08/30 职场文书
2014年设计师工作总结
2014/11/25 职场文书
小学教师年度个人总结
2015/02/05 职场文书
就业推荐表院系意见
2015/06/05 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
表扬信范文
2019/04/22 职场文书
创业计划书介绍
2019/04/24 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript
Javascript webpack动态import
2022/04/19 Javascript