杰瑞科技汇

python排序dataframe

  1. 按列的值排序:这是最常用的排序方式,即根据某一列或多列的数据大小对整个 DataFrame 的行进行重新排列。
  2. 按索引排序:根据 DataFrame 的行索引或列索引进行排序。

下面我将详细介绍这两种排序方法,并提供丰富的示例。

python排序dataframe-图1
(图片来源网络,侵删)

准备工作:创建示例 DataFrame

我们创建一个用于演示的 DataFrame。

import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
    '年龄': [25, 32, 28, 45, 22, 35],
    '分数': [88, 92, 76, 85, 90, 78],
    '部门': ['研发', '市场', '研发', '销售', '市场', '研发']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)

输出:

原始 DataFrame:
  姓名  年龄  分数  部门
0  张三  25  88  研发
1  李四  32  92  市场
2  王五  28  76  研发
3  赵六  45  85  销售
4  钱七  22  90  市场
5  孙八  35  78  研发

按列的值排序

使用 DataFrame.sort_values() 方法。

按单列排序

语法: df.sort_values(by='列名', ascending=True/False, inplace=True/False)

python排序dataframe-图2
(图片来源网络,侵删)
  • by: 指定要排序的列名(字符串)。
  • ascending: 布尔值,排序顺序。
    • True (默认): 升序 (从小到大)。
    • False: 降序 (从大到小)。
  • inplace: 布尔值,是否在原 DataFrame 上修改。
    • False (默认): 返回一个新的排序后的 DataFrame,原 DataFrame 不变。
    • True: 直接在原 DataFrame 上进行排序,不返回任何值。

示例 1: 按“年龄”列升序排序

# 按 '年龄' 列升序排序 (默认)
df_sorted_age_asc = df.sort_values(by='年龄')
print("\n按 '年龄' 升序排序:")
print(df_sorted_age_asc)

输出:

按 '年龄' 升序排序:
  姓名  年龄  分数  部门
4  钱七  22  90  市场
0  张三  25  88  研发
2  王五  28  76  研发
1  李四  32  92  市场
5  孙八  35  78  研发
3  赵六  45  85  销售

示例 2: 按“分数”列降序排序

# 按 '分数' 列降序排序
df_sorted_score_desc = df.sort_values(by='分数', ascending=False)
print("\n按 '分数' 降序排序:")
print(df_sorted_score_desc)

输出:

按 '分数' 降序排序:
  姓名  年龄  分数  部门
1  李四  32  92  市场
4  钱七  22  90  市场
0  张三  25  88  研发
3  赵六  45  85  销售
2  王五  28  76  研发
5  孙八  35  78  研发

按多列排序

by 参数传入一个列名列表时,即可实现多列排序,排序的优先级与列表中的顺序一致:先按第一个列排序,如果第一个列的值相同,再按第二个列排序,以此类推。

示例 3: 先按“部门”升序,再按“分数”降序

# 先按 '部门' (A-Z) 排序,部门相同时,再按 '分数' (从高到低) 排序
df_sorted_multi = df.sort_values(by=['部门', '分数'], ascending=[True, False])
print("\n先按 '部门' 升序,再按 '分数' 降序排序:")
print(df_sorted_multi)

输出:

先按 '部门' 升序,再按 '分数' 降序排序:
  姓名  年龄  分数  部门
0  张三  25  88  研发
5  孙八  35  78  研发
2  王五  28  76  研发
1  李四  32  92  市场
4  钱七  22  90  市场
3  赵六  45  85  销售

解释:

  • 所有“研发”部门的记录排在最前面,内部按分数从高到低(张三88 > 孙八78 > 王五76)。
  • 所有“市场”部门的记录排在中间,内部按分数从高到低(李四92 > 钱七90)。
  • “销售”部门只有一条记录,排在最后。

按索引排序

使用 DataFrame.sort_index() 方法。

按行索引排序

语法: df.sort_index(axis=0, ascending=True/False, inplace=True/False)

  • axis: 0 (默认) 表示按行索引排序,1 表示按列索引排序。
  • ascendinginplace 参数与 sort_values() 含义相同。

示例 4: 按行索引降序排序

# 按 行索引 降序排序
df_sorted_index_desc = df.sort_index(ascending=False)
print("\n按行索引降序排序:")
print(df_sorted_index_desc)

输出:

按行索引降序排序:
  姓名  年龄  分数  部门
5  孙八  35  78  研发
4  钱七  22  90  市场
3  赵六  45  85  销售
2  王五  28  76  研发
1  李四  32  92  市场
0  张三  25  88  研发

按列索引排序

示例 5: 按列索引升序排序 (默认就是升序)

# 按 列索引 (A-Z) 排序
df_sorted_columns = df.sort_index(axis=1)
print("\n按列索引升序排序:")
print(df_sorted_columns)

输出:

按列索引升序排序:
   部门  姓名  年龄  分数
0  研发  张三  25  88
1  市场  李四  32  92
2  研发  王五  28  76
3  销售  赵六  45  85
4  市场  钱七  22  90
5  研发  孙八  35  78

重要参数:na_position

当数据中存在缺失值 (NaN) 时,可以使用 na_position 参数来控制 NaN 值的排布位置。

  • na_position='first' (默认): 将 NaN 值放在最前面。
  • na_position='last': 将 NaN 值放在最后面。

示例 6: 处理缺失值

# 创建一个带有 NaN 值的 DataFrame
df_with_nan = df.copy()
df_with_nan.loc[1, '分数'] = np.nan
df_with_nan.loc[3, '年龄'] = np.nan
print("\n带有 NaN 值的 DataFrame:")
print(df_with_nan)
# 默认情况下,NaN 会被排在最前面
print("\n按 '年龄' 升序排序 (NaN 在前):")
print(df_with_nan.sort_values(by='年龄'))
# 将 NaN 放在最后面
print("\n按 '年龄' 升序排序 (NaN 在后):")
print(df_with_nan.sort_values(by='年龄', na_position='last'))

输出:

带有 NaN 值的 DataFrame:
  姓名    年龄   分数  部门
0  张三  25.0  88.0  研发
1  李四  32.0   NaN  市场
2  王五  28.0  76.0  研发
3  赵六   NaN  85.0  销售
4  钱七  22.0  90.0  市场
5  孙八  35.0  78.0  研发
按 '年龄' 升序排序 (NaN 在前):
  姓名    年龄   分数  部门
3  赵六   NaN  85.0  销售
4  钱七  22.0  90.0  市场
0  张三  25.0  88.0  研发
2  王五  28.0  76.0  研发
1  李四  32.0   NaN  市场
5  孙八  35.0  78.0  研发
按 '年龄' 升序排序 (NaN 在后):
  姓名    年龄   分数  部门
4  钱七  22.0  90.0  市场
0  张三  25.0  88.0  研发
2  王五  28.0  76.0  研发
1  李四  32.0   NaN  市场
5  孙八  35.0  78.0  研发
3  赵六   NaN  85.0  销售

方法 功能 常用参数 示例
df.sort_values() 按列的值对行进行排序 by (列名), ascending (升降序), inplace (是否原地修改), na_position (NaN位置) df.sort_values(by='年龄', ascending=False)
df.sort_index() 按索引进行排序 axis (0=行索引, 1=列索引), ascending, inplace df.sort_index(ascending=False)

核心要点:

  • 按值排序sort_values按索引排序sort_index
  • inplace=False 是更安全、更推荐的做法,因为它会保留原始数据。
  • 多列排序时,byascending 都传入列表,顺序要对应。
  • 遇到 NaN 值时,记得使用 na_position 来控制其位置。
分享:
扫描分享到社交APP
上一篇
下一篇