详解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实现全局变量的两个解决方法
Jul 03 Python
Python操作SQLite简明教程
Jul 10 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 Python
教你如何使用Python实现二叉树结构及三种遍历
Jun 18 Python
Python Django获取URL中的数据详解
Nov 01 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 fsockopen函数被禁用的解决办法
2013/08/07 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
php实现图片压缩处理
2020/09/09 PHP
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
django实现分页的方法
2015/05/26 Python
玩转python爬虫之正则表达式
2016/02/17 Python
pandas带有重复索引操作方法
2018/06/08 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
北京申奥口号
2014/06/19 职场文书
优秀团支部申报材料
2014/12/26 职场文书
python 中的@运算符使用
2021/05/26 Python
JavaScript设计模式之原型模式详情
2022/06/21 Javascript