浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)


Posted in Python onApril 10, 2018

pandas为我们提供了多种切片方法,而要是不太了解这些方法,就会经常容易混淆。下面举例对这些切片方法进行说明。

数据介绍

先随机生成一组数据:

In [5]: rnd_1 = [random.randrange(1,20) for x in xrange(1000)]
  ...: rnd_2 = [random.randrange(1,20) for x in xrange(1000)]
  ...: rnd_3 = [random.randrange(1,20) for x in xrange(1000)]
  ...: fecha = pd.date_range('2012-4-10', '2015-1-4')
  ...: 
  ...: data = pd.DataFrame({'fecha':fecha, 'rnd_1': rnd_1, 'rnd_2': rnd_2, 'rnd_3': rnd_3})
In [6]: data.describe()
Out[6]: 
       rnd_1    rnd_2    rnd_3
count 1000.000000 1000.000000 1000.000000
mean   9.946000   9.825000   9.894000
std    5.553911   5.559432   5.423484
min    1.000000   1.000000   1.000000
25%    5.000000   5.000000   5.000000
50%   10.000000  10.000000  10.000000
75%   15.000000  15.000000  14.000000
max   19.000000  19.000000  19.000000

[]切片方法

使用方括号能够对DataFrame进行切片,有点类似于python的列表切片。按照索引能够实现行选择或列选择或区块选择。

# 行选择
In [7]: data[1:5]
Out[7]: 
    fecha rnd_1 rnd_2 rnd_3
1 2012-04-11   1   16   3
2 2012-04-12   7   6   1
3 2012-04-13   2   16   7
4 2012-04-14   4   17   7
# 列选择
In [10]: data[['rnd_1', 'rnd_3']]
Out[10]: 
   rnd_1 rnd_3
0    8   12
1    1   3
2    7   1
3    2   7
4    4   7
5    12   8
6    2   12
7    9   8
8    13   17
9    4   7
10   14   14
11   19   16
12    2   12
13   15   18
14   13   18
15   13   11
16   17   7
17   14   10
18    9   6
19   11   15
20   16   13
21   18   9
22    1   18
23    4   3
24    6   11
25    2   13
26    7   17
27   11   8
28    3   12
29    4   2
..   ...  ...
970   8   14
971   19   5
972   13   2
973   8   10
974   8   17
975   6   16
976   3   2
977   12   6
978   12   10
979   15   13
980   8   4
981   17   3
982   1   17
983   11   5
984   7   7
985   13   14
986   6   19
987   13   9
988   3   15
989   19   6
990   7   11
991   11   7
992   19   12
993   2   15
994   10   4
995   14   13
996   12   11
997   11   15
998   17   14
999   3   8
[1000 rows x 2 columns]
# 区块选择
In [11]: data[:7][['rnd_1', 'rnd_2']]
Out[11]: 
  rnd_1 rnd_2
0   8   17
1   1   16
2   7   6
3   2   16
4   4   17
5   12   19
6   2   7

不过对于多列选择,不能像行选择时一样使用1:5这样的方法来选择。

In [12]: data[['rnd_1':'rnd_3']]
 File "<ipython-input-13-6291b6a83eb0>", line 1
  data[['rnd_1':'rnd_3']]
         ^
SyntaxError: invalid syntax

loc

loc可以让你按照索引来进行行列选择。

In [13]: data.loc[1:5]
Out[13]: 
    fecha rnd_1 rnd_2 rnd_3
1 2012-04-11   1   16   3
2 2012-04-12   7   6   1
3 2012-04-13   2   16   7
4 2012-04-14   4   17   7
5 2012-04-15   12   19   8

这里需要注意的是,loc与第一种方法不同之处在于会把第5行也选择进去,而第一种方法只会选择到第4行为止。

data.loc[2:4, ['rnd_2', 'fecha']]
Out[14]: 
  rnd_2   fecha
2   6 2012-04-12
3   16 2012-04-13
4   17 2012-04-14

loc能够选择在两个特定日期之间的数据,需要注意的是这两个日期必须都要在索引中。

In [15]: data_fecha = data.set_index('fecha')
  ...: data_fecha.head()
Out[15]: 
      rnd_1 rnd_2 rnd_3
fecha             
2012-04-10   8   17   12
2012-04-11   1   16   3
2012-04-12   7   6   1
2012-04-13   2   16   7
2012-04-14   4   17   7
In [16]: # 生成两个特定日期
  ...: fecha_1 = dt.datetime(2013, 4, 14)
  ...: fecha_2 = dt.datetime(2013, 4, 18)
  ...: 
  ...: # 生成切片数据
  ...: data_fecha.loc[fecha_1: fecha_2]
Out[16]: 
      rnd_1 rnd_2 rnd_3
fecha             
2013-04-14   17   10   5
2013-04-15   14   4   9
2013-04-16   1   2   18
2013-04-17   9   15   1
2013-04-18   16   7   17

更新:如果没有特殊需求,强烈建议使用loc而尽量少使用[],因为loc在对DataFrame进行重新赋值操作时会避免chained indexing问题,使用[]时编译器很可能会给出SettingWithCopy的警告。

具体可以参见官方文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

iloc

如果说loc是按照索引(index)的值来选取的话,那么iloc就是按照索引的位置来进行选取。iloc不关心索引的具体值是多少,只关心位置是多少,所以使用iloc时方括号中只能使用数值。

# 行选择
In [17]: data_fecha[10: 15]
Out[17]: 
      rnd_1 rnd_2 rnd_3
fecha             
2012-04-20   14   6   14
2012-04-21   19   14   16
2012-04-22   2   6   12
2012-04-23   15   8   18
2012-04-24   13   8   18
# 列选择
In [18]: data_fecha.iloc[:,[1,2]].head()
Out[18]: 
      rnd_2 rnd_3
fecha          
2012-04-10   17   12
2012-04-11   16   3
2012-04-12   6   1
2012-04-13   16   7
2012-04-14   17   7
# 切片选择
In [19]: data_fecha.iloc[[1,12,34],[0,2]]
Out[19]: 
      rnd_1 rnd_3
fecha          
2012-04-11   1   3
2012-04-22   2   12
2012-05-14   17   10

at

at的使用方法与loc类似,但是比loc有更快的访问数据的速度,而且只能访问单个元素,不能访问多个元素。

In [20]: timeit data_fecha.at[fecha_1,'rnd_1']
The slowest run took 3783.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 11.3 µs per loop
In [21]: timeit data_fecha.loc[fecha_1,'rnd_1']
The slowest run took 121.24 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 192 µs per loop
In [22]: data_fecha.at[fecha_1,'rnd_1']
Out[22]: 17

iat

iat对于iloc的关系就像at对于loc的关系,是一种更快的基于索引位置的选择方法,同at一样只能访问单个元素。

In [23]: data_fecha.iat[1,0]
Out[23]: 1
In [24]: timeit data_fecha.iat[1,0]
The slowest run took 6.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.77 µs per loop
In [25]: timeit data_fecha.iloc[1,0]
10000 loops, best of 3: 158 µs per loop

ix

以上说过的几种方法都要求查询的秩在索引中,或者位置不超过长度范围,而ix允许你得到不在DataFrame索引中的数据。

In [28]: date_1 = dt.datetime(2013, 1, 10, 8, 30)
  ...: date_2 = dt.datetime(2013, 1, 13, 4, 20)
  ...: 
  ...: # 生成切片数据
  ...: data_fecha.ix[date_1: date_2]
Out[28]: 
      rnd_1 rnd_2 rnd_3
fecha             
2013-01-11   19   17   19
2013-01-12   10   9   17
2013-01-13   15   3   10

如上面的例子所示,2013年1月10号并没有被选择进去,因为这个时间点被看作为0点0分,比8点30分要早一些。

以上这篇浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python脚本实现分析dns日志并对受访域名排行
Sep 18 Python
讲解Python中for循环下的索引变量的作用域
Apr 15 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
详解Python装饰器
Mar 25 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
python下载库的步骤方法
Oct 12 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
python pandas dataframe 行列选择,切片操作方法
Apr 10 #Python
python3下实现搜狗AI API的代码示例
Apr 10 #Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 #Python
浅谈Pandas中map, applymap and apply的区别
Apr 10 #Python
对pandas中apply函数的用法详解
Apr 10 #Python
Python 25行代码实现的RSA算法详解
Apr 10 #Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 #Python
You might like
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
python sort、sorted高级排序技巧
2014/11/21 Python
python如何读写csv数据
2018/03/21 Python
python2.7实现爬虫网页数据
2018/05/25 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
Python多线程的退出控制实现
2020/08/10 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
建筑设计专业求职自我评价
2014/03/02 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
第一书记观后感
2015/06/08 职场文书
银行资信证明
2015/06/17 职场文书
解约证明模板
2015/06/19 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript