1.函数应用和映射
NumPy的ufuncs(元素级数组方法)也可用于操作pandas对象
frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Uath','Ohio','Texas','Oregon'])
print frame
print np.abs(frame)
结果为:
b d e
Uath 1.187068 1.589404 0.328555
Ohio -0.040634 1.489594 -0.453027
Texas 0.362667 0.601500 2.177313
Oregon 0.019020 -0.315751 -0.480646
b d e
Uath 1.187068 1.589404 0.328555
Ohio 0.040634 1.489594 0.453027
Texas 0.362667 0.601500 2.177313
Oregon 0.019020 0.315751 0.480646
另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现此功能
f=lambda x:x.max()-x.min()
print frame.apply(f)
print frame.apply(f,axis=1)
结果为:
b 0.605155
d 2.173279
e 2.737098
dtype: float64
Uath 1.913344
Ohio 0.302252
Texas 1.663901
Oregon 1.654397
dtype: float64
许多最为常见的数组统计功能都能被实现成DataFrame的方法(比如sum和mean),因此无需使用apply方法
除标量值外,传递给apply的函数还可以返回由多个值组成的Series
def f(x):
return Series([x.min(),x.max()],index=['min','max'])
print frame.apply(f)
结果为:
b d e
min -1.878553 -1.339043 -2.638153
max 1.051156 1.322494 0.242260
此外,元素级的Python函数也是可以用的。如你想得到frame中各个浮点值的格式化字符串,可以使用applymap
format=lambda x:'%.2f' % x
print frame.applymap(format)
结果为:
b d e
Uath 0.27 0.94 0.73
Ohio -0.81 0.78 -1.04
Texas 1.00 0.64 0.61
Oregon 0.55 -0.17 -0.40
之所以叫做applymap,是因为Series有一个用于应用元素级函数的map方法
print frame['e'].map(format)
结果为:
Uath 0.17
Ohio 2.22
Texas 0.58
Oregon 0.18
Name: e, dtype: object
2.排序和排名
要对行或列索引进行排序(按字典排序),可使用sort_index方法,它将返回一个已排序的新对象
obj=Series(range(4),index=['d','a','b','c'])
print obj.sort_index()
结果为:
a 1
b 2
c 3
d 0
dtype: int64
而对于DataFrame,可以根据任意一个轴上的索引进行排序
frame2=DataFrame(np.arange(8).reshape(2,4),index=['three','one'],columns=['d','a','b','c'])
print frame2.sort_index()
print frame2.sort_index(axis=1)
结果为:
d a b c
one 4 5 6 7
three 0 1 2 3
a b c d
three 1 2 3 0
one 5 6 7 4
数据默认是按照升序排序的,也可以降序排序
print frame2.sort_index(axis=1,ascending=False)
结果为:
d c b a
three 0 3 2 1
one 4 7 6 5
若要按值对Series进行排序,可使用其order方法
obj2=Series([4,7,-3,2])
print obj2.order()
结果为:
2 -3
3 2
0 4
1 7
在排序时,任何缺失值默认都会被放到Series末尾
obj3=Series([4,np.nan,7,np.nan,-3,2])
print obj3.order()
结果为:
4 -3
5 2
0 4
2 7
1 NaN
3 NaN
dtype: float64
在DataFrame上,你可能希望根据一个或多个列中的值进行排序。将一个或多个列的名字传递给by选项即可达到该目的
frame3=DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
print frame3
print frame3.sort_index(by='b')
结果为:
a b
0 0 4
1 1 7
2 0 -3
3 1 2
a b
2 0 -3
3 1 2
0 0 4
1 1 7
要根据多个列进行排序,传入名称的列表即可
print frame3.sort_index(by=['a','b'])
结果为:
a b
2 0 -3
0 0 4
3 1 2
1 1 7
排名(ranking)跟排序关系密切,且它会增设一个排名值(从1开始,一直到数组中有效数据的数量)。默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的
obj4=Series([7,-5,7,4,2,0,4])
print obj4.rank()
结果为:
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
也可以根据值在原数据中出现的顺序给出排名
print obj4.rank(method='first')
结果为:
0 6
1 1
2 7
3 4
4 3
5 2
6 5
dtype: float64
也可以按降序进行排名
print obj4.rank(method='max',ascending=False)
结果为:
0 2
1 7
2 2
3 4
4 5
5 6
6 4
dtype: float64
3.带有重复值的轴索引
索引的is_unique属性可以告诉你它的值是否是唯一的
obj5=Series(range(5),index=['a','a','b','b','c'])
print obj5
pr