根据条件对Series对象或DataFrame对象的值排序(Sorting)和排名(Ranking)是Pandas一种重要的内置运算。Series对象或DataFrame对象可以使用sort_index()/sort_values()函数进行排序,使用rank()函数进行排名。
1 Series的排序
Series的sort_index()函数:
sort_index(ascending = True)
对Series的索引进行排序,默认是升序。
例如:
import pandas as pd s = pd.Series([10, 20, 33], index=["a", "c", "b"]) # 定义一个Series print(s.sort_index()) # 对Series的索引进行排序,默认是升序
结果如下:
a 10 b 33 c 20
对索引进行降序排序:
print(s.sort_index(ascending=False)) # ascending=False表示是降序排序
Series不仅可以按索引进行排序,还可以使用sort_values()函数按值排序。
print(s.sort_values(ascending=False)) # ascending=False表示是降序排序
结果如下:
b 33 c 20 a 10
2 DataFrame的排序
DataFrame的sort_index()函数:
sort_index(self, axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None
其中部分参数含义如下。
axis:0表示按照索引排序;1表示按照列名排序。
level:默认为None,否则按照给定的级别排序。
ascending:默认为True,表示升序排序;False,表示降序排序。
inplace:默认为False,否则排序之后的数据直接替换原来的DataFrame。
kind:默认为quicksort,表示排序的方法。
na_position:缺失值默认排在最前(取值为first)/后(取值为last)。
sort_remaining:如果为True,则在按指定级别排序后再按其他的级别排序。
by:按照指定值排序。
例如:
import pandas as pd df= pd.DataFrame([[199901, '张海', '男' ,100, 100, 25, 72], [199902, '赵大强', '男', 95, 54, 44, 88], [199903, '李梅', '女', 54, 76, 13, 91], [199904, '吉建军', '男', 89, 78, 26, 100]] , columns = ['xuehao', 'name', 'sex', 'physics', 'Python', 'math', 'English'], index=[1,4,6,2])
使用sort_index(),可以对DataFrame进行排序。默认情况下,按照升序对索引进行排序。
sorted_df=df.sort_index() #对索引进行升序排序 print(sorted_df)
结果如下:
xuehao name sex physics Python Math English 1 199901 张海 男 100 100 25 72 2 199904 吉建军 男 89 78 26 100 4 199902 赵大强 男 95 54 44 88 6 199903 李梅 女 54 76 13 91
通过将布尔值传递给参数ascending,可以控制排序顺序。
sorted_df=df.sort_index(ascending = False) #索引降序排序
通过令axis参数值为0或1,可以按索引或按列名进行排序。默认情况下,axis=0,逐行排序。下面举例来介绍axis参数。
sorted_df=df.sort_index(axis=1) #按列名排序 print(sorted_df)
结果如下:
English math name physics Python sex xuehao 1 72 25 张海 100 100 男 199901 4 88 44 赵大强 95 54 男 199902 6 91 13 李梅 54 76 女 199903 2 100 26 吉建军 89 78 男 199904
实际上,在日常计算中,按值排序较多。例如,按分数高低、学号、性别排序,这时可以使用sort_values()。DataFrame的sort_values()是按值排序的函数,它接收一个by参数指定排序的列名。
sorted_df2=df.sort_values(by='English') #按值排序 print(sorted_df2)
运行后可见结果同上。
English的值相同时如何排列呢?实际上也可以通过by参数指定排序需要的多列。
import pandas as pd import numpy as np unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]}) sorted_df = unsorted_df.sort_values(by=['col1','col2']) print(sorted_df)
结果如下:
col1 col2 2 1 2 1 1 3 3 1 4 0 2 1
可见,col1值相同时按照col2值再排序。这里我们可以认为col1是第一排序条件,col2是第二排序条件,只有col1值相同时才用到第二排序条件。
sort_values()提供了一个从mergesort(合并排序)、heapsort(堆排序)和quicksort(快速排序)中选择排序算法的参数kind。其中mergesort是唯一稳定的算法。
import pandas as pd unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]}) sorted_df = unsorted_df.sort_values(by='col1' ,kind='mergesort') print(sorted_df)