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

数据介绍

先随机生成一组数据:

import pandas as pd
import numpy as np

state = ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada']
year = [2000, 2001, 2002, 2003, 2004]
pop = [1.3, 1.4, 1.6, 4.5, 2.7]
frame = pd.DataFrame({'state': state, 'year': year, 'pop': pop})
print(frame)

 结果:

   pop   state  year
0  1.3    Ohio  2000
1  1.4    Ohio  2001
2  1.6    Ohio  2002
3  4.5  Nevada  2003
4  2.7  Nevada  2004

1. []切片方法

# 行选择
print(frame[1:3])

# 列选择
print(frame[['year', 'pop']])

# 区块选择
print(frame[:3][['state', 'year']])

 结果:

   pop state  year
1  1.4  Ohio  2001
2  1.6  Ohio  2002
year pop 0 2000 1.3 1 2001 1.4 2 2002 1.6 3 2003 4.5 4 2004 2.7
state year 0 Ohio 2000 1 Ohio 2001 2 Ohio 2002

2.loc(按照索引来进行行列选择)

# 行选择
print(frame.loc[1:3])

# 区块选择
print(frame.loc[1:3, ['year', 'pop']])

 结果:

   pop   state  year
1  1.4    Ohio  2001
2  1.6    Ohio  2002
3  4.5  Nevada  2003
year pop 1 2001 1.4 2 2002 1.6 3 2003 4.5

 注意:loc与[]的不同之处在于会把3也选择进去,而使用[]是不包含的。

In [15]: 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的警告。

3.iloc

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

# 行选择
print(frame.iloc[1:3])

# 列选择
print(frame.iloc[:, [1, 2]])

# 区块选择
print(frame.iloc[[1, 3, 4], [0, 2]])

 结果:

   pop state  year
1  1.4  Ohio  2001
2  1.6  Ohio  2002
state year 0 Ohio 2000 1 Ohio 2001 2 Ohio 2002 3 Nevada 2003 4 Nevada 2004
pop year 1 1.4 2001 3 4.5 2003 4 2.7 2004

4.at

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

import time
start = time.clock() frame.at[1,'year'] Out[8]: 2001 end = time.clock() end - start Out[11]: 30.75638200200791
start = time.clock() frame.loc[1,'year'] Out[13]: 2001 end = time.clock() end - start Out[15]: 29.014473024534

5.iat

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

In [15]:frame.iat[1,2]
Out[16]: 2001

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

原文地址:https://www.cnblogs.com/mlan/p/8192256.html