在数据处理中,排序是最常用的操作之一。通过排序,我们可以快速找到数据中的最大值、最小值,或者按照特定规律组织数据,便于后续分析。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分)。

七、总结与注意事项

  1. 核心参数by指定排序列,ascending控制方向,inplace决定是否修改原数据。
  2. 多列排序byascending均可传入列表,需注意列表长度一致。
  3. 数据安全:优先使用inplace=False(默认),避免意外修改原数据。
  4. 进阶操作:结合reset_index(drop=True)可重置排序后的索引(如df.sort_values(...).reset_index(drop=True))。

通过以上示例,你已经掌握了sort_values的基本用法和实战技巧。排序是数据处理的基础技能,后续分析(如TopN、分组统计)常需依赖排序结果。多练习不同场景(如单列、多列、降序、inplace),就能熟练应用了!

小夜