您的位置:首页 > 其它

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

2017-06-03 12:22 633 查看
目录(?)[-]
数据介绍
切片方法
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

[]切片方法

使用方括号能够对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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

不过对于多列选择,不能像行选择时一样使用1:5这样的方法来选择。
In [12]: data[['rnd_1':'rnd_3']]
File "<ipython-input-13-6291b6a83eb0>", line 1
data[['rnd_1':'rnd_3']]
^
SyntaxError: invalid syntax
1
2
3
4
5
1
2
3
4
5

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
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
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
1
2
3
4
5
6
1
2
3
4
5
6

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

更新:如果没有特殊需求,强烈建议使用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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

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
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

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
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9

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
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11

如上面的例子所示,2013年1月10号并没有被选择进去,因为这个时间点被看作为0点0分,比8点30分要早一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: