2. DataFrame按标签或者按值排序

DataFrame有两种排序方法,分别是sort_index 和 sort_values, 他们分别可以按标签排序和按值排序,其中sort_values方法比较常用。

1. 按标签排序

sort_index方法提供了按标签排序的功能,默认是进行行排序,也可以通过设置axis参数为1,进行列排序

1.1 按标签行排序

import pandas as pd

data1 = [
    {'语文': 90, '数学': 92, '姓名': '小明'},
    {'语文': 98, '数学': 87, '姓名': '小刚'},
    {'语文': 87, '数学': 90, '姓名': '小丽'},
    {'语文': 90, '数学': 98, '姓名': '小王'},
]

df = pd.DataFrame(data1, index=[1, 3, 2, 4])
df.index.name = '学号'
df.columns.name = '科目'
print(df)

print("*"*20)
sorted_df = df.sort_index()
print(sorted_df)

程序输出结果

科目  姓名  数学  语文
学号            
1   小明  92  90
3   小刚  87  98
2   小丽  90  87
4   小王  98  90
********************
科目  姓名  数学  语文
学号            
1   小明  92  90
2   小丽  90  87
3   小刚  87  98
4   小王  98  90

如果想根据学号降序排序,则需要设置参数ascending为False

sorted_df = df.sort_index(ascending=False)
print(sorted_df)

1.2 按标签列排序

import pandas as pd

data1 = [
    {'2020-01-03': 7, '2020-01-02': 8, '2020-01-01': 4},
    {'2020-01-03': -4, '2020-01-02': -2, '2020-01-01':-9},
]

df = pd.DataFrame(data1, index=['最高温', '最低温'], columns=['2020-01-03', '2020-01-02', '2020-01-01'])
print(df)

print('*'*20)
sorted_df = df.sort_index(axis=1)  # 根据日期进行列排序
print(sorted_df)

为了演示效果,我故意设计了一个DataFrame,列名使用日期,且是无序的,其内容为

     2020-01-03  2020-01-02  2020-01-01
最高温           7           8           4
最低温          -4          -2          -9

我希望能够按照日期从小到大排序来展示数据,调用sort_index时设置axis参数为1,排序后的DataFrame是

     2020-01-01  2020-01-02  2020-01-03
最高温           4           8           7
最低温          -9          -2          -4

2. 按值排序

2.1 按值行排序

sort_values提供按值排序的算法,设置参数by来决定用哪一列的值进行排序

import pandas as pd

data1 = [
    {'语文': 90, '数学': 98, '姓名': '小明'},
    {'语文': 98, '数学': 87, '姓名': '小刚'},
    {'语文': 87, '数学': 90, '姓名': '小丽'},
    {'语文': 90, '数学': 92, '姓名': '小王'},
]

df = pd.DataFrame(data1, index=[1, 3, 2, 4])
df.index.name = '学号'
df.columns.name = '科目'

print(df)
print("*"*20)

sorted_df = df.sort_values(by='语文')
print(sorted_df)

在示例中,使用语文成绩进行排序,程序输出结果为

科目  姓名  数学  语文
学号            
1   小明  98  90
3   小刚  87  98
2   小丽  90  87
4   小王  92  90
********************
科目  姓名  数学  语文
学号            
2   小丽  90  87
1   小明  98  90
4   小王  92  90
3   小刚  87  98

语文成绩从小到大,当语文成绩相同时,我希望能够按照数学成绩进行排序,这要要求就需要设置多个排序的列名

sorted_df = df.sort_values(by=['语文', '数学'])
print(sorted_df)

排序后的sorted_df内容是

科目  姓名  数学  语文
学号            
2   小丽  90  87
4   小王  92  90
1   小明  98  90
3   小刚  87  98

2.2 按值列排序

sort_values同样支持设置axis参数

import pandas as pd

data1 = [
    {'2020-01-03': 7, '2020-01-02': 8, '2020-01-01': 4},
    {'2020-01-03': -4, '2020-01-02': -2, '2020-01-01':-9},
]

df = pd.DataFrame(data1, index=['最高温', '最低温'], columns=['2020-01-03', '2020-01-02', '2020-01-01'])
print(df)

sorted_df = df.sort_values(axis=1, by='最高温')
print(sorted_df)

在这个示例中,我希望能够根据最高温度进行列排序,排序后的结果是

     2020-01-01  2020-01-03  2020-01-02
最高温           4           7           8
最低温          -9          -4          -2

3. 设置排序算法

进行排序时,你可以指定排序算法,默认使用快速排序,下面的示例使用归并排序

sorted_df = df.sort_values(axis=1, by='最高温', kind='mergesort')
print(sorted_df)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案