详解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 相关文章推荐
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
单链表反转python实现代码示例
Feb 08 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
selenium+python自动化测试之多窗口切换
Jan 23 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
Pycharm和Idea支持的vim插件的方法
Feb 21 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
python和js交互调用的方法
Jun 23 Python
python 如何将office文件转换为PDF
Sep 22 Python
python 利用opencv实现图像网络传输
Nov 12 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 程序员应该使用的10个组件
2009/10/31 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
javascript html实现网页版日历代码
2016/03/08 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
python函数参数*args**kwargs用法实例
2013/12/04 Python
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
简单分析python的类变量、实例变量
2019/08/23 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
通过代码实例了解Python sys模块
2020/09/14 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
2014新年元旦活动策划方案
2014/02/18 职场文书
媒体宣传策划方案
2014/05/25 职场文书
经典毕业生求职信
2014/07/12 职场文书
工程索赔意向书
2014/08/30 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
企业法人授权委托书
2014/09/25 职场文书
计划生育责任书
2015/05/09 职场文书
导游词之无锡东林书院
2019/12/11 职场文书