视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
pandas中的Dataframe查询有哪些方法
2020-11-27 14:22:08 责编:小采
文档


这次给大家带来pandas中的Dataframe查询有哪些方法,pandas中Dataframe查询的注意事项有哪些,下面就是实战案例,一起来看一下。

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.4000
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
9 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分要早一些。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

python怎样实现百度语音识别api的步奏详解

python如何调用API实现智能回复功能

下载本文
显示全文
专题