• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞代码 4年前 (2022-01-07) 18次浏览 已收录 0个评论

下面小编就为大家分享一篇浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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 "", 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<a style="color:transparent">来源gao*daima.com搞@代#码网</a>   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)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持gaodaima搞代码网

以上就是浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址