4. Pandas的Series的Slice
Slice切片,pandas的Series的切片,以位置信息去使用切片,和python里的切片的意义是一样的即含起点不含终点half-open。但Series还支持一种label的方式定位每个元素,常用字符串做index,所以在label上使用切片和python不一样的地方是即含起点又含终点。如果用整形位置信息作为label,会产生歧义,建议不这样用。总之,整形做位置信息切片,字符串做label切片。有关切片的使用,之前的章节已经说过了,这里不重复了。
import pandas as pd
import numpy as np
val = [2, 4, 5, 6]
ii = range(10, 14)
s0 = pd.Series(val)
s1 = pd.Series(val, index = ii)
idx = "hello the cruel world".split()
t = pd.Series(val, index = idx)
print "s0", "*" * 11
print s0[0:2]
print "s1", "*" * 11
print s1[ii[0:2]],"\n"
print s1[10:12],"\n"
print s1[0:2]
print s1[20:30]
print s1[13]
print "t", "*" * 12
print t[0:2]
print t["hello":"cruel"]
print "-" * 14
print s0.iloc[0:2],'\n'
print s1.loc[10:12],'\n'
print s1.iloc[10:12],'\n'
print t.loc["hello":"cruel"],'\n'
print t.ix[0:2]
对于s1的打印语句
print s1[ii[0:2]],"\n"
print s1[10:12],"\n"
print s1[0:2]
print s1[20:30]
四条语句,那些是切片?s1[0:2]
和s1[20:30]
很明显是切片。s1[10:12]
为何没有结果?原因s1里10~12位置上没有数据,故切出来的是空,同s1[20:30]
一样的道理。s1[ii[0:2]]
则是多index。可以从下面的例子理解s1的各种“切片”的结果为何如此?
import pandas as pd
idx = range(10, 30)
val = range(1, 21)
s = pd.Series(val, index = idx)
print s
print s[0:2],"\n"
print s[10:12]
程序的执行结果:
10 1
11 2
...
19 10
20 11
21 12
22 13
...
29 20
dtype: int64
10 1
11 2
dtype: int64
20 11
21 12
dtype: int64
在Pandas里使用切片最标准的定义Series和使用是t变量这种创建Series的方式和使用index、slice的方式。即用字符串做label(显式),用整形做位置信息(隐式),但显式切片和隐式切片的结果不同,显示含终点,隐式不含终点。
print t[0:2]
print t["hello":"cruel"]
语句执行结果不同,尽管label标签cruel的位置为2。