杰瑞科技汇

Python DataFrame如何高效排序?

核心方法

Pandas 提供了两个主要的排序方法:

Python DataFrame如何高效排序?-图1
(图片来源网络,侵删)
  1. df.sort_values(): 按值排序,这是最常用的方法,它根据 DataFrame 中的一个或多个列的值对行进行排序。
  2. df.sort_index(): 按索引排序,它根据 DataFrame 的行索引或列索引进行排序。

sort_values() 对列值进行排序

这是最核心的排序功能。

基本语法

df.sort_values(by, axis=0, ascending=True, inplace=False, na_position='last')

参数详解

参数 类型 描述 默认值
by strlist 必需参数,指定要依据哪个列或哪些列进行排序,可以是单个列名(字符串),也可以是多个列名的列表。 -
axis intstr 指定排序的轴。0'index' 表示按行排序(即对列值排序);1'columns' 表示按列排序(即对行值排序)。 0
ascending boollist 排序的顺序。True 为升序(从小到大),False 为降序(从大到小),如果传入一个布尔值的列表,则可以分别控制 by 中每个列的排序顺序。 True
inplace bool 是否在原地修改 DataFrame,如果为 True,则直接修改原 DataFrame,方法返回 None,如果为 False,则返回一个新的排序后的 DataFrame,原 DataFrame 不变。 False
na_position str 指定 NaN(缺失值)的位置。'first' 表示放在最前面,'last' 表示放在最后面。 'last'

示例

我们创建一个示例 DataFrame:

import pandas as pd
import numpy as np
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '孙七', '周八'],
    '年龄': [25, 32, 28, np.nan, 22, 35],
    '分数': [88, 92, 76, 85, 90, 78]
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
原始 DataFrame:
   姓名   年龄  分数
0  张三  25.0  88
1  李四  32.0  92
2  王五  28.0  76
3  赵六   NaN  85
4  孙七  22.0  90
5  周八  35.0  78

示例 1:按单列升序排序

# 按 '年龄' 列升序排序
sorted_df = df.sort_values(by='年龄')
print("\n按 '年龄' 升序排序:")
print(sorted_df)
按 '年龄' 升序排序:
   姓名   年龄  分数
4  孙七  22.0  90
0  张三  25.0  88
2  王五  28.0  76
1  李四  32.0  92
5  周八  35.0  78
3  赵六   NaN  85  # NaN 默认排在最后

示例 2:按单列降序排序

# 按 '分数' 列降序排序
sorted_df = df.sort_values(by='分数', ascending=False)
print("\n按 '分数' 降序排序:")
print(sorted_df)
按 '分数' 降序排序:
   姓名   年龄  分数
1  李四  32.0  92
4  孙七  22.0  90
0  张三  25.0  88
3  赵六   NaN  85
2  王五  28.0  76
5  周八  35.0  78

示例 3:按多列排序(先按第一列,再按第二列)

当传入一个列名列表时,排序会按列表的顺序依次进行。

# 先按 '年龄' 升序,如果年龄相同,再按 '分数' 降序
sorted_df = df.sort_values(by=['年龄', '分数'], ascending=[True, False])
print("\n先按 '年龄' 升序,再按 '分数' 降序:")
print(sorted_df)
先按 '年龄' 升序,再按 '分数' 降序:
   姓名   年龄  分数
4  孙七  22.0  90  # 年龄最小,分数最高
0  张三  25.0  88  # 年龄第二,分数第二
2  王五  28.0  76  # 年龄第三,分数最低
1  李四  32.0  92  # 年龄第四,分数最高
5  周八  35.0  78  # 年龄最大,分数较低
3  赵六   NaN  85  # NaN 仍然排在最后

示例 4:处理缺失值 NaN

# 将 NaN 值排在最前面
sorted_df_nan_first = df.sort_values(by='年龄', na_position='first')
print("\n将 NaN 值排在最前面:")
print(sorted_df_nan_first)
将 NaN 值排在最前面:
   姓名   年龄  分数
3  赵六   NaN  85
4  孙七  22.0  90
0  张三  25.0  88
2  王五  28.0  76
1  李四  32.0  92
5  周八  35.0  78

示例 5:原地排序 (inplace=True)

# 原地按 '分数' 降序排序
df.sort_values(by='分数', ascending=True, inplace=True)
print("\n原地排序后的 DataFrame:")
print(df)
# 注意:此时原始 df 已经被改变

sort_index() 对索引进行排序

当你修改了 DataFrame 的行顺序后,索引可能会变得混乱,这时就需要用 sort_index() 来重置索引的顺序。

Python DataFrame如何高效排序?-图2
(图片来源网络,侵删)

基本语法

df.sort_index(axis=0, level=None, ascending=True, inplace=False, na_position='last')

参数与 sort_values() 类似,但 by 参数被 level(用于多级索引)替代。

示例

我们使用上面示例 3 排序后的 DataFrame,它的索引顺序是 [4, 0, 2, 1, 5, 3]

# 使用上面示例3的排序结果
df_multi_sorted = df.sort_values(by=['年龄', '分数'], ascending=[True, False])
print("多列排序后的 DataFrame (索引混乱):")
print(df_multi_sorted)
多列排序后的 DataFrame (索引混乱):
   姓名   年龄  分数
4  孙七  22.0  90
0  张三  25.0  88
2  王五  28.0  76
1  李四  32.0  92
5  周八  35.0  78
3  赵六   NaN  85

我们按索引进行排序:

# 按索引升序排序
df_sorted_by_index = df_multi_sorted.sort_index()
print("\n按索引排序后:")
print(df_sorted_by_index)
按索引排序后:
   姓名   年龄  分数
0  张三  25.0  88
1  李四  32.0  92
2  王五  28.0  76
3  赵六   NaN  85
4  孙七  22.0  90
5  周八  35.0  78

可以看到,行数据保持不变,但行的顺序已经按照索引 [0, 1, 2, 3, 4, 5] 重新排列了。

Python DataFrame如何高效排序?-图3
(图片来源网络,侵删)

按行进行排序(按列值排序)

sort_values() 也可以对列进行排序,这需要设置 axis=1

示例

# 创建一个新的 DataFrame
data_cols = {
    'Q1': [100, 80, 95],
    'Q2': [110, 85, 105],
    'Q3': [105, 90, 100]
}
df_cols = pd.DataFrame(data_cols, index=['产品A', '产品B', '产品C'])
print("原始按列排序的 DataFrame:")
print(df_cols)
原始按列排序的 DataFrame:
       Q1   Q2   Q3
产品A  100  110  105
产品B   80   90   90
产品C   95  105  100

示例 6:按列值升序排序

这将根据每列的值对列本身进行重新排列。

# 按 '产品A' 这一行的值对所有列进行升序排序
sorted_cols_df = df_cols.sort_values(by='产品A', axis=1)
print("\n按 '产品A' 行的值对列进行升序排序:")
print(sorted_cols_df)
按 '产品A' 行的值对列进行升序排序:
       Q1   Q3   Q2
产品A  100  105  110
产品B   80   90   90
产品C   95  100  105

解释:比较 产品A 行的值 100, 110, 105,升序排列后是 100 (Q1), 105 (Q3), 110 (Q2),所以列的顺序变成了 Q1, Q3, Q2


总结与最佳实践

需求 推荐方法 示例
根据一个或多个列的值对行进行排序 df.sort_values(by=['col1', 'col2']) df.sort_values(by='年龄', ascending=False)
根据索引对行进行排序(重置行顺序) df.sort_index() df.sort_index()
根据行的值对列进行排序 df.sort_values(by='row_name', axis=1) df.sort_values(by='产品A', axis=1)
希望原地修改 DataFrame df.sort_values(..., inplace=True) df.sort_values(by='分数', inplace=True)
希望保留原始 DataFrame sorted_df = df.sort_values(...) (默认) new_df = df.sort_values(by='年龄')

重要提示

  • 优先使用 inplace=False:除非你确定不需要原始 DataFrame,否则最好将排序后的结果赋给一个新变量,这样可以避免意外修改原始数据,使代码更易于调试和维护。
  • NaN 处理:默认情况下,NaN 会被排在最后,如果业务逻辑要求 NaN 排在最前,记得设置 na_position='first'
分享:
扫描分享到社交APP
上一篇
下一篇