数据介绍
先随机生成一组数据:
import pandas as pdimport numpy as npstate = ['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 year0 1.3 Ohio 20001 1.4 Ohio 20012 1.6 Ohio 20023 4.5 Nevada 20034 2.7 Nevada 2004
1. []切片方法
# 行选择print(frame[1:3])# 列选择print(frame[['year', 'pop']])# 区块选择print(frame[:3][['state', 'year']])
结果:
pop state year1 1.4 Ohio 20012 1.6 Ohio 2002 year pop0 2000 1.31 2001 1.42 2002 1.63 2003 4.54 2004 2.7 state year0 Ohio 20001 Ohio 20012 Ohio 2002
2.loc(按照索引来进行行列选择)
# 行选择print(frame.loc[1:3])# 区块选择print(frame.loc[1:3, ['year', 'pop']])
结果:
pop state year1 1.4 Ohio 20012 1.6 Ohio 20023 4.5 Nevada 2003 year pop1 2001 1.42 2002 1.63 2003 4.5
注意:loc与[]的不同之处在于会把3也选择进去,而使用[]是不包含的。
In [15]: data_fecha.head()Out[15]: rnd_1 rnd_2 rnd_3fecha 2012-04-10 8 17 122012-04-11 1 16 32012-04-12 7 6 12012-04-13 2 16 72012-04-14 4 17 7In [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_3fecha 2013-04-14 17 10 52013-04-15 14 4 92013-04-16 1 2 182013-04-17 9 15 12013-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 year1 1.4 Ohio 20012 1.6 Ohio 2002 state year0 Ohio 20001 Ohio 20012 Ohio 20023 Nevada 20034 Nevada 2004 pop year1 1.4 20013 4.5 20034 2.7 2004
4.at
at的使用方法与loc类似,但是比loc有更快的访问数据的速度,而且只能访问单个元素,不能访问多个元素。
import time start = time.clock()frame.at[1,'year']Out[8]: 2001end = time.clock()end - startOut[11]: 30.75638200200791 start = time.clock()frame.loc[1,'year']Out[13]: 2001end = time.clock()end - startOut[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_3fecha 2013-01-11 19 17 192013-01-12 10 9 172013-01-13 15 3 10
2013年1月10号并没有被选择进去,因为这个时间点被看作为0点0分,比8点30分要早一些。