本节前言
排序与排名是数据探索的常用手段。本节涵盖索引排序、数值排序以及多种排名策略。
1. sort_index()
按索引(行索引或列索引)排序。
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
axis | int / str | 0 | 0=‘index’;1=‘columns’ |
ascending | bool | True | 升序 / 降序 |
inplace | bool | False | 是否原地修改 |
kind | str | ’quicksort’ | 排序算法:quicksort、mergesort、heapsort、stable |
na_position | str | ’last' | 'first’ / ‘last’:缺失值位置 |
sort_remaining | bool | True | MultiIndex 是否按剩余层级排序 |
ignore_index | bool | False | 排序后是否重置索引 |
key | callable | None | 排序前对 Index 应用的函数 |
示例
df = pd.DataFrame(
{'A': [3, 1, 2]},
index=[3, 1, 2]
)
df.sort_index()
# A
# 1 1
# 2 2
# 3 3
df.sort_index(ascending=False)
df.sort_index(axis=1)
# MultiIndex 部分排序
df_mi = df.set_index(['A', 'B'])
df_mi.sort_index(level='A', sort_remaining=False)sort_index 与 sort_values 的区别
sort_index()按索引排序,sort_values()按列的值排序。
2. sort_values()
按一列或多列的值排序。
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
by | str / list | 必填 | 参与排序的列名 |
axis | int / str | 0 | 排序轴 |
ascending | bool / list | True | 升 / 降序,可为每列指定 |
inplace | bool | False | 是否原地修改 |
kind | str | ’quicksort’ | 排序算法 |
na_position | str | ’last’ | 缺失值位置 |
ignore_index | bool | False | 重置索引 |
key | callable | None | 排序前应用函数 |
示例
df = pd.DataFrame({
'A': [3, 1, 2, 1],
'B': ['x', 'y', 'x', 'z']
})
df.sort_values('A')
# A B
# 1 1 y
# 3 1 z
# 2 2 x
# 0 3 x
# 多列排序
df.sort_values(['A', 'B'])
# 不同方向
df.sort_values(['A', 'B'], ascending=[True, False])
# 缺失值在前
df.sort_values('A', na_position='first')
# key 参数
df.sort_values('A', key=lambda col: col.abs())3. rank()
计算排名。
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
axis | int / str | 0 | 按行或列排名 |
method | str | ’average’ | 排名策略(见下表) |
numeric_only | bool | False | 是否只对数值列排名 |
na_option | str | ’keep' | 'keep’ / ‘top’ / ‘bottom’:缺失值处理 |
ascending | bool | True | 升序排名(值越大排名越高) |
pct | bool | False | 是否返回百分比排名 |
method 排名策略
| method | 行为 | 示例:[1, 2, 2, 3] 的排名 |
|---|---|---|
average | 并列取平均排名 | 1.0, 2.5, 2.5, 4.0 |
min | 并列取最小排名 | 1.0, 2.0, 2.0, 4.0 |
max | 并列取最大排名 | 1.0, 3.0, 3.0, 4.0 |
dense | 并列不跳号 | 1.0, 2.0, 2.0, 3.0 |
first | 先到先得排名 | 1.0, 2.0, 3.0, 4.0 |
示例
df = pd.DataFrame({'A': [1, 2, 2, 3], 'B': [10, 20, 30, 40]})
df.rank()
# A B
# 0 1.0 1.0
# 1 2.5 2.0
# 2 2.5 3.0
# 3 4.0 4.0
df['A'].rank(method='dense')
# 0 1.0
# 1 2.0
# 2 2.0
# 3 3.0
df['A'].rank(pct=True)
# 0 0.25
# 1 0.625
# 2 0.625
# 3 1.0
df['A'].rank(na_option='bottom') # 缺失值排最后4. nlargest()
返回数值最大的前 n 行。
df.nlargest(2, 'A')
# A B
# 3 3 40
# 2 2 30
# 多列
df.nlargest(3, ['A', 'B'])
# 与 sort_values 等价
df.sort_values('A', ascending=False).head(2)5. nsmallest()
返回数值最小的前 n 行。
df.nsmallest(2, 'A')
# A B
# 0 1 10
# 1 2 20应用场景
nlargest/nsmallest在部分排序场景下比sort_values()+head()更高效。- 排名可与
groupby结合,实现组内排名。