A 排序(按照索引index)
在Series和DataFrame中,如果按照row或column 的index来排序的话,可以使用sort_index()方法来排序,默认排序是按row index。如果要按column index 排序,那么sort_inde(axis=1)
import numpy as np
import pandas as pd
obj=pd.Series(range(4),index=['d','b','c','a'])
print(obj.sort_index())
#输出:
a 3
b 1
c 2
d 0
#可以看出按照index 排序
#对于DataFrame:
frame=pd.DataFrame(np.arange(12.).reshape(3,4),columns=list('deab'),index=['three','one','two'])
print(frame)
#输出:
d e a b
three 0.0 1.0 2.0 3.0
one 4.0 5.0 6.0 7.0
two 8.0 9.0 10.0 11.0
print(frame.sort_index())
#输出:
d e a b
one 4.0 5.0 6.0 7.0
three 0.0 1.0 2.0 3.0
two 8.0 9.0 10.0 11.0
#可以从结果看出来是默认是按照row index 从大到小排序的
print(frame.sort_index(axis=1))
#输出:
a b d e
three 2.0 3.0 0.0 1.0
one 6.0 7.0 4.0 5.0
two 10.0 11.0 8.0 9.0
#从结果知道是按照column index 大小排序的
sort_index()默认是升序,sort_index(axis=1,ascending=False) 是降序排序
print(frame.sort_index(axis=1,ascending=False))
#输出:
e d b a
three 1.0 0.0 3.0 2.0
one 5.0 4.0 7.0 6.0
two 9.0 8.0 11.0 10.0
B排序(按照值)
sort_values()
1.
obj=pd.Series([4,-7,3,2])
print(obj)
print(obj.sort_values())
print(obj.sort_values(ascending=False))
#输出:
0 4
1 -7
2 3
3 2
dtype: int64
1 -7
3 2
2 3
0 4
dtype: int64
0 4
2 3
3 2
1 -7
dtype: int64
如果一个数据有缺失值,会把缺失值排在最后!
obj1=pd.Series([4,np.nan,-7,np.nan,3,2])
print(obj1)
print(obj1.sort_values())
print(obj1.sort_values(ascending=False))
#输出:
0 4.0
1 NaN
2 -7.0
3 NaN
4 3.0
5 2.0
dtype: float64
2 -7.0
5 2.0
4 3.0
0 4.0
1 NaN
3 NaN
dtype: float64
0 4.0
4 3.0
5 2.0
2 -7.0
1 NaN
3 NaN
dtype: float64
对于DataFrame,可以用一列或者多列作为sort keys(排序的键值)
frame1=pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
print(frame1)
print(frame1.sort_values(by=['b']))
print(frame.sort_values(by=['a','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
d e a b
three 0.0 1.0 2.0 3.0
one 4.0 5.0 6.0 7.0
two 8.0 9.0 10.0 11.0
Rank排名,给有效的数据分配数字。数字代表这个index 以前指向的数据在整个原来的Series中排名是多少。
obj2=pd.Series([7, -5, 7, 4, 2, 0, 4])
print(obj2)
print(obj2.sort_values())
print(obj2.rank())
#输出:
0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
1 -5
5 0
4 2
3 4
6 4
0 7
2 7
dtype: int64
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
#从第三个结果中可以看出来,后面的浮点数数值代表的是index 0 指向的
#的数据7在所有数据里面排名6.5,这是因为整个Series中有2个7,分别排名第6名
#和第7名,所以默认取平均值6.5,同上,4排名第4名和第5名,所以取平均值4.5
#(排名从第1名开始,没有第0名)
所以从rank中找到排名在根据index对应的数据,就能清楚这个数据在整个数据是排名多少了。
rank还可以根据数据被排序后观测到的顺序进行排名:
print(obj2)
print(obj2.rank(method='first'))
#输出:
0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
#可以看出这是根据obj2按从小到大的数值大小排序,然后根据观测到数据的先后进行排名的.
print(obj2.rank(ascending=False,method='first')) #降序
#输出:
0 1.0
1 7.0
2 2.0
3 3.0
4 5.0
5 6.0
6 4.0
DataFrame也可以根据行或列来计算rank()
frame2=pd.DataFrame({'b': [4.3, 7, -3, 2],
'a': [0, 1, 0, 1],
'c': [-2, 5, 8, -2.5]})
print(frame2)
#输出:
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
print(frame2.rank(axis='columns'))
#输出:
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
C.有重复label的轴索引
我们看到的所有例子索引都是不重复的,唯一的轴标签(索引值)。一些pandas函数(reindex),需要label是唯一的,但这并是不强制的。比如下面有一个重复的索引:
obj3 = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
print(obj3)
#输出:
a 0
a 1
b 2
b 3
c 4
dtype: int64
#index的is_unique特性能返回index 的label 是否唯一
print(obj3.index.is_unique)
#输出:
False
#数据选择对于重复label则表现有点不同。如果一个label有多个值,那么就会返回一个series, 如果是label只对应一个值的话,会返回一个标量
print(obj3['a'])
#输出:
a 0
a 1
print(obj3['c'])
#输出:
4
对于DataFrame:
#这个选择的逻辑也应用于DataFrame:
df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])
print(df)
#输出:
0 1 2
a 1.350684 -0.791739 2.318765
a -0.559660 1.141115 -0.447092
b -0.622946 -1.342305 1.158423
b 0.646948 1.533911 -0.551540
print(df.loc['b'])
#输出:
0 1 2
b 0.612960 1.053828 0.167829
b -0.116479 0.115436 -0.418042
记住对于DataFrame 用行索引, 要用loc[] 或则ilco[]!!!!!!!!!!!