pandas库学习(八) 函数应用和映射
对DataFrame进行绝对值操作:
frame = DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
b d e
Utah 1.246489 -0.596254 1.308865
Ohio -0.714781 -0.056512 -1.089707
Texas 0.691823 0.633026 1.243367
Oregon 0.024873 -0.944009 0.586263
np.abs(frame)
b d e
Utah 1.246489 0.596254 1.308865
Ohio 0.714781 0.056512 1.089707
Texas 0.691823 0.633026 1.243367
Oregon 0.024873 0.944009 0.586263
根据索引排序:
obj = Series(range(4),index=['d','a','b','c'])
d 0
a 1
b 2
c 3
dtype: int64
obj.sort_index()
a 1
b 2
c 3
d 0
dtype: int64
对于DataFrame来说,可以选择其中一个轴来进行来排序
如:frame.sort_index(axis=1,ascending=False)
此时是降序,默认是升序
上面提到了按索引对Series进行排序,接下来按值对Series进行排序
obj=Series([4,7,-3,2])
0 4
1 7
2 -3
3 2
dtype: int64
obj.sort_values()
2 -3
3 2
0 4
1 7
dtype: int64
如果有缺失值,会被放到最后面
对DataFrame进行排序。(注:sort_index()方法已经被弃用)
frame=DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
a b
0 0 4
1 1 7
2 0 -3
3 1 2
按照某列进行排序,比如b列
frame.sort_values(by='b')
a b
2 0 -3
3 1 2
0 0 4
1 1 7
a和b列都要进行排序
frame.sort_values(by=['a','b'])
a b
2 0 -3
0 0 4
3 1 2
1 1 7
Series排名操作(ranking)
Series.rank(method='average',ascending=True)
method可选参数有:average, min, max, first
这个排名和排序有点不一样,看看结果就知道有多么的诡异
obj = Series([7,-5,7,4,2,0,4])
0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
obj.rank()
此时method默认为average
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
这上面是个什么情况,感觉没有被排名啊,看图:
图01
明白上面之后,再看method参数的解释:
average 默认:在相等分组中,为各个值分配平均排名
first 按值在原始数据中的出现顺序分配排名
min 使用整个分组的最小排名
max 使用整个分组的最大排名
obj.rank(method='first')
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
又是一脸懵逼,再来看图:
图02
为什么1号是6.0而不是7.0,毕竟它们的值都是相同的,因为这里method为'first',这里的意思就是1号的7在2号7的前面(从原始数据看),所以1号的排名就要在2号的前面,同理3号和4号是一样的道理
method为max和min也是同样的理解
对于DataFrame排名也是一样比如:
frame = DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-2.5]})
a b c
0 0 4.3 -2.0
1 1 7.0 5.0
2 0 -3.0 8.0
3 1 2.0 -2.5
frame.rank(axis=1)
a b c
0 2.0 3.0 1.0
1 1.0 3.0 2.0
2 2.0 1.0 3.0
3 2.0 3.0 1.0
可以检查是否有重复索引
obj = Series(range(5),index=['a','a','b','b','c'])
a 0
a 1
b 2
b 3
c 4
dtype: int64
obj.index.is_unique
结果为False