数据介绍
先随机生成一组数据:
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分要早一些。