sort_values() 和 sort_index(),你可以轻松将数据排列成所需的顺序。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六', '陈七', '刘八'],
'年龄': [28, 35, 42, 29, 31, np.nan],
'工资': [8000, 12000, 15000, 9500, 11000, 10500],
'部门': ['技术', '销售', '技术', '管理', '销售', '技术'],
'入职年份': [2020, 2018, 2015, 2021, 2019, 2022]
}, index=['E', 'B', 'A', 'D', 'C', 'F'])
print("原始数据:")
print(df)
sort_values()这是最常用的排序方法,用于根据一列或多列的数值进行排序。
# 按年龄升序(默认)
df.sort_values('年龄')
# 按工资降序
df.sort_values('工资', ascending=False)
# 先按部门升序,再按工资降序
df.sort_values(['部门', '工资'], ascending=[True, False])
by 排序列名
ascending 升序/降序
na_position 缺失值位置
inplace 原地修改
key 自定义排序键
# 处理缺失值:将 NaN 放在最前面
df.sort_values('年龄', na_position='first')
# 原地修改(不返回新对象)
df.sort_values('工资', ascending=False, inplace=True)
# 使用 key 参数:按年龄的绝对值排序(示例)
df_abs = pd.DataFrame({'值': [-5, 3, -2, 1]})
df_abs.sort_values('值', key=lambda col: abs(col))
sort_index()对行索引或列索引进行排序,常用于数据对齐后恢复顺序。
# 按行索引升序(默认)
df.sort_index()
# 按行索引降序
df.sort_index(ascending=False)
# 按列名排序(axis=1)
df.sort_index(axis=1)
# 对 Series 也适用
s = pd.Series([1, 2, 3], index=['c', 'a', 'b'])
s.sort_index()
# 重新创建原始顺序的副本(索引乱序)
df_original = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六', '陈七', '刘八'],
'年龄': [28, 35, 42, 29, 31, np.nan],
'工资': [8000, 12000, 15000, 9500, 11000, 10500],
'部门': ['技术', '销售', '技术', '管理', '销售', '技术'],
'入职年份': [2020, 2018, 2015, 2021, 2019, 2022]
}, index=['E', 'B', 'A', 'D', 'C', 'F'])
print("1. 按工资降序,缺失年龄的行在前:")
print(df_original.sort_values('工资', ascending=False, na_position='first'))
print("\n2. 先按部门升序,再按年龄降序:")
print(df_original.sort_values(['部门', '年龄'], ascending=[True, False]))
print("\n3. 按行索引排序(字母顺序):")
print(df_original.sort_index())
print("\n4. 按列名排序:")
print(df_original.sort_index(axis=1))
print("\n5. 自定义排序规则:按姓名长度排序")
df_original['姓名长度'] = df_original['姓名'].str.len()
df_original.sort_values('姓名长度', ascending=False, inplace=True)
print(df_original.drop('姓名长度', axis=1))
对于具有 MultiIndex 的 DataFrame,sort_index() 可以按层级排序。
# 创建多级索引示例
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=['字母', '数字'])
df_multi = pd.DataFrame({'值': [10, 5, 20, 15]}, index=index)
print("原始多级索引:")
print(df_multi)
print("\n按第一级索引升序,第二级降序:")
print(df_multi.sort_index(level=[0,1], ascending=[True, False]))
df = df.sort_values(...)。
ascending=[True, False] 对应第一列升序、第二列降序。
na_position 只对排序列有效;若需控制其他列的缺失值,需单独处理。
df.info() 确认数据类型,避免因类型错误导致排序异常(如字符串数字混排)。