在数据处理中,排序是最常用的操作之一。通过排序,我们可以快速找到数据中的最大值、最小值,或者按照特定规律组织数据,便于后续分析。pandas作为Python中强大的数据处理库,提供了sort_values函数来实现数据排序。本文将从基础到实战,带大家一步步掌握这个函数的使用。
一、为什么需要排序?¶
想象你有一份学生成绩表,包含姓名、语文、数学、英语成绩。如果想知道谁的语文成绩最好,直接查看原始数据可能需要逐行对比。但如果用sort_values对语文成绩排序,结果会直接按分数从高到低排列,一目了然。
二、sort_values函数基础¶
sort_values的核心作用是对DataFrame或Series按照指定列的值进行排序。它的基本语法如下:
df.sort_values(by, ascending=True, inplace=False, axis=0)
参数说明:
- by:必填,指定排序的列名(或列名列表)。
- ascending:可选,排序方向。True(默认)为升序,False为降序。若按多列排序,可传入列表(如[True, False])。
- inplace:可选,是否直接修改原DataFrame。False(默认)返回新排序后的DataFrame,不改变原数据;True则直接修改原数据。
- axis:可选,排序方向。0(默认)按行排序,1按列排序(较少使用,初学者可暂不深入)。
三、基础排序示例¶
我们先用一个简单的学生成绩表作为示例数据:
import pandas as pd
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'语文': [85, 76, 90, 88],
'数学': [92, 85, 78, 95],
'英语': [78, 90, 82, 89]
}
df = pd.DataFrame(data)
1. 单列升序排序¶
按“语文”成绩从小到大排序(升序):
sorted_df = df.sort_values(by='语文') # 按语文成绩升序,默认ascending=True
print(sorted_df)
输出结果:
姓名 语文 数学 英语
1 李四 76 85 90
0 张三 85 92 78
3 赵六 88 95 89
2 王五 90 78 82
可以看到,“李四”(76分)的语文成绩最低,排在最前面;“王五”(90分)最高,排在最后。
2. 单列降序排序¶
按“数学”成绩从大到小排序(降序):
sorted_df = df.sort_values(by='数学', ascending=False) # ascending=False表示降序
print(sorted_df)
输出结果:
姓名 语文 数学 英语
3 赵六 88 95 89
0 张三 85 92 78
1 李四 76 85 90
2 王五 90 78 82
“赵六”(95分)数学成绩最高,排在第一位;“王五”(78分)最低,排在最后。
四、多列排序¶
当某列值相同时,可按另一列的值继续排序。例如,先按“语文”成绩升序,若语文成绩相同,再按“数学”成绩降序:
sorted_df = df.sort_values(by=['语文', '数学'], ascending=[True, False])
print(sorted_df)
输出结果:
姓名 语文 数学 英语
1 李四 76 85 90
0 张三 85 92 78
3 赵六 88 95 89
2 王五 90 78 82
解释:
- 先按“语文”升序:张三(85)、赵六(88)、王五(90)中,李四(76)最低排在第一。
- 语文成绩相同时(这里没有重复),按“数学”降序(但本例中语文成绩无重复,结果不变)。
五、修改原数据(inplace参数)¶
默认情况下,sort_values不会修改原DataFrame,而是返回一个新的排序后DataFrame。若需直接修改原数据,可设置inplace=True:
df.sort_values(by='英语', ascending=False, inplace=True) # 直接修改df
print(df) # 原df已被修改
注意:inplace=True可能导致原数据被覆盖,建议优先使用默认inplace=False以保留原数据。
六、实战案例:按总分排序¶
假设需要分析学生的综合成绩,可先计算“总分”,再按总分降序排序:
# 新增“总分”列
df['总分'] = df['语文'] + df['数学'] + df['英语']
# 按总分降序排序
sorted_df = df.sort_values(by='总分', ascending=False)
print(sorted_df)
输出结果:
姓名 语文 数学 英语 总分
3 赵六 88 95 89 272
0 张三 85 92 78 255
1 李四 76 85 90 251
2 王五 90 78 82 250
可以看到,“赵六”总分最高(272分),“王五”总分最低(250分)。
七、总结与注意事项¶
- 核心参数:
by指定排序列,ascending控制方向,inplace决定是否修改原数据。 - 多列排序:
by和ascending均可传入列表,需注意列表长度一致。 - 数据安全:优先使用
inplace=False(默认),避免意外修改原数据。 - 进阶操作:结合
reset_index(drop=True)可重置排序后的索引(如df.sort_values(...).reset_index(drop=True))。
通过以上示例,你已经掌握了sort_values的基本用法和实战技巧。排序是数据处理的基础技能,后续分析(如TopN、分组统计)常需依赖排序结果。多练习不同场景(如单列、多列、降序、inplace),就能熟练应用了!