本文是学习《利用Python进行数据分析》的部分笔记,在这里感谢作者
pandas基本功能二:
1,:函数应用和映射
Numpy的ufuncs(元素级函数方法)也可以用于操作pandas对象
frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
frame
Out[5]:
b d e
Utah 1.021003 -0.813102 -0.111531
Ohio -0.450382 -0.532916 0.103158
Texas -0.539250 -0.686338 -3.314287
Oregon -0.173919 0.566496 -0.869736
np.abs(frame)
Out[6]:
b d e
Utah 1.021003 0.813102 0.111531
Ohio 0.450382 0.532916 0.103158
Texas 0.539250 0.686338 3.314287
Oregon 0.173919 0.566496 0.869736
另一个常见的操作是:将函数应用到由各列或者各行所形成的一维数组上。DataFrame的apply方法即可实现此功能:
f=lambda x:x.max()-x.min()
frame.apply(f)
Out[8]:
b 1.560253
d 1.379598
e 3.417445
dtype: float64
frame.apply(f,axis=1)
Out[9]:
Utah 1.834105
Ohio 0.636073
Texas 2.775037
Oregon 1.436232
dtype: float64
许多最为常见的数组统计功能都被实现为DataFrame的方法(如sum和mean),因此无需使用apply方法。
除标量值外,传递给apply的函数还可以返回由多个值组成的Series:
def f(x):
return Series([x.min(),x.max()],index=['min','max'])
frame.apply(f)
Out[14]:
b d e
min -0.539250 -0.813102 -3.314287
max 1.021003 0.566496 0.103158
此外,元素级的Python函数也是可以用的,加入你想得到frame中各个浮点值的格式化字符串,使用applymap即可:
format=lambda x: '%.2f' % x
frame.applymap(format)
Out[17]:
b d e
Utah 1.02 -0.81 -0.11
Ohio -0.45 -0.53 0.10
Texas -0.54 -0.69 -3.31
Oregon -0.17 0.57 -0.87
之所以叫做applymap,是因为Series有一个应用于元素级函数的map方法:
frame['e'].map(format)
Out[18]:
Utah -0.11
Ohio 0.10
Texas -3.31
Oregon -0.87
Name: e, dtype: object
2.排序和排名:
sort_index方法·用于对列名或者行名进行排序:有两个参数,一个是axis,另一个是ascending。默认等于true表示升序排列,等于false表示降序。
frame=DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])
frame
Out[20]:
d a b c
three 0 1 2 3
one 4 5 6 7
frame.sort_index()
Out[21]:
d a b c
one 4 5 6 7
three 0 1 2 3
frame.sort_index(axis=1)
Out[22]:
a b c d
three 1 2 3 0
one 5 6 7 4
若要按值对Series进行排序,可以用其sort_values()方法:
obj=Series([4,7,-3,2])
obj.sort_values()
Out[25]:
2 -3
3 2
0 4
1 7
dtype: int64
在DataFrame中,可以根据一个或者多个列中的值进行排序,将一个或者多个列的名字传递给by选项即可达到该目的:
frame=DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
frame.sort_values(by='b')
Out[30]:
a b
2 0 -3
3 1 2
0 0 4
1 1 7
三:带有重复值的索引:
便签唯一不是强制性的:索引的is_unique属性可以告诉你它的值是否是唯一的:
obj=Series(range(5),index=['a','a','b','b','c'])
obj.index.is_unique
Out[33]: False