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。

感谢Klang(金浪)智能数据看板klang.org.cn鼎力支持!