# 一、按索引排序：sort_index()

sort_index() 是 pandas 中按索引排序的函数，默认情况下， sort_index 是按行索引来排序。

sort_index(
self,
axis=0,
level=None,
ascending: bool | int | Sequence[bool | int] = True,
inplace: bool = False,
kind: str = "quicksort",
na_position: str = "last",
sort_remaining: bool = True,
ignore_index: bool = False,
key: IndexKeyFunc = None,
)

• axis：默认为axis=0表示按行排序，当axis=1表示按列排序。
• ascending：默认为True升序排序，为False降序排序
• inplace：是否修改原始数据

## 1. Series类型排序

Series对象排序中，axis参数只能为0

### 1）升序

import pandas as pd
import numpy as np

df = pd.Series([1, 2, 3, 4], index=["A", "B", "C", "D"])
print(df.sort_index())

### 2）降序

import pandas as pd
import numpy as np

df = pd.Series([1, 2, 3, 4], index=["A", "B", "C", "D"],)
print(df.sort_index(ascending=False))

## 2. DataFrame类型排序

### 1）按行索引排序

1. 默认 ascending=True 升序排序
import pandas as pd
import numpy as np

data = np.arange(16).reshape((4, 4))
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_index(axis=0))

1. 设置 ascending=False 倒序
import pandas as pd
import numpy as np

data = np.arange(16).reshape((4, 4))
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_index(axis=0, ascending=False))

运行结果：

### 2）按列索引排序

1. 默认 ascending=True 升序排序
import pandas as pd
import numpy as np

data = np.arange(16).reshape((4, 4))
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_index(axis=1, ascending=True))

运行结果：

1. 设置 ascending=False 倒序
import pandas as pd
import numpy as np

data = np.arange(16).reshape((4, 4))
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_index(axis=1, ascending=False))

# 二、按值排序：sort_values()

## 1. Series类型排序

sort_values(
self,
axis=0,
ascending: bool | int | Sequence[bool | int] = True,
inplace: bool = False,
kind: str = "quicksort",
na_position: str = "last",
ignore_index: bool = False,
key: ValueKeyFunc = None,
)

• axis：只能为0
• ascending：默认为True升序排序，为False降序排序
• inplace：是否修改原始Series

### 1）升序

import pandas as pd
import numpy as np

df = pd.Series([5, 3, 2, 4, 1], index=["A", "B", "C", "D", "E"])
print(df)
print(df.sort_values())

### 2）降序

import pandas as pd
import numpy as np

df = pd.Series([5, 3, 2, 4, 1], index=["A", "B", "C", "D", "E"])
print(df)
print(df.sort_values(ascending=False))

## 2. DataFrame类型排序

sort_values(  # type: ignore[override]
self,
by,
axis: Axis = 0,
ascending=True,
inplace: bool = False,
kind: str = "quicksort",
na_position: str = "last",
ignore_index: bool = False,
key: ValueKeyFunc = None,
)

• by：字符串或者List<字符串>，单列排序或者多列排序
• ascending：默认为True升序排序，为False降序排序
• inplace：是否修改原始数据
• kind：选择排序算法，默认是 ‘quicksort’，该参数只针对单个列时才有效
• mergesort：归并排序
• heapsort：堆排序
• quicksort：快速排序
• na_position：缺失值处理
• last：缺失值排最后
• first：缺失值排开头

### 1）单列排序

1. 默认 ascending=True 升序排序
import pandas as pd
import numpy as np

data = values = [[4, 7, 3, 1], [5, 3, 9, 8], [4, 1, 8, 5], [6, 2, 3, 5]]
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_values(by='a'))

运行结果：

1. 设置 ascending=False 倒序
import pandas as pd
import numpy as np

data = values = [[4, 7, 3, 1], [5, 3, 9, 8], [4, 1, 8, 5], [6, 2, 3, 5]]
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_values(by='a',ascending=False))

运行结果：

### 2）多列排序

1. 两列排序：默认 ascending=True 升序排序
import pandas as pd
import numpy as np

data = values = [[4, 7, 3, 1], [5, 3, 9, 8], [4, 1, 8, 5], [6, 2, 3, 5]]
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_values(by=['a','b']))

1. 两列排序：默认 ascending=False 降序排序
import pandas as pd
import numpy as np

data = values = [[4, 7, 3, 1], [5, 3, 9, 8], [4, 1, 8, 5], [6, 2, 3, 5]]
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
print(df.sort_values(by=['a','b'],ascending=False))

运行结果：

1. 两列排序：分别指定排序方法
import pandas as pd
import numpy as np

data = values = [[4, 7, 3, 1], [5, 3, 9, 8], [4, 1, 8, 5], [6, 2, 3, 5]]
df = pd.DataFrame(data, columns=['c', 'a', 'b', 'd'], index=['D', 'B', 'C', 'A'])
print(df)
# 分别指定升序和降序
print(df.sort_values(by=['a','b'], ascending=[True, False]))

运行结果：

### 3）排序算法

kind：选择排序算法，默认是 ‘quicksort’，该参数只针对单个列时才有效

• mergesort：归并排序
• heapsort：堆排序
• quicksort：快速排序

### 4）缺失值

na_position：缺失值处理

• last：缺失值排最后
• first：缺失值排开头

1、默认 na_position = last 缺失值排最后:

import pandas as pd
import numpy as np

data = {'A': [1, 5, 9, 6, 3],
'B': [5, 9, 2, np.nan, 3],
'C': [0, 8, 4, 3, 2],
}
df = pd.DataFrame(data)
print(df)
print(df.sort_values(by='B'))

2、设置 na_position = first 缺失值排开头:

import pandas as pd
import numpy as np

data = {'A': [1, 5, 9, 6, 3],
'B': [5, 9, 2, np.nan, 3],
'C': [0, 8, 4, 3, 2],
}
df = pd.DataFrame(data)
print(df)
print(df.sort_values(by='B',na_position = 'first'))

### 5）key参数

import pandas as pd
import numpy as np

data = {'A': ['BB', 'AA', 'DD', 'EE','CC'],
'B': [5, 9, 2, np.nan, 3],
'C': [0, 8, 4, 3, 2],
}
df = pd.DataFrame(data)
print(df.sort_values(by='B'))
# key参数:字符串所有大写字符转化为小写
print(df.sort_values(by='B', key=lambda col: col.str.lower()))

# 三、排名：rank()

rank(
self: FrameOrSeries,
axis=0,
method: str = "average",
numeric_only: bool_t | None = None,
na_option: str = "keep",
ascending: bool_t = True,
pct: bool_t = False,
) -> FrameOrSeries

• average：默认值，在每个组中分配平均排名
• min：使用整个整个分组的最小排名
• max： 使用整个分组的最大排名
• first： 按值在原始数据中的出现顺序分配排名
• dense：类似于method=‘min’,但组件排名总是加1，而不是一个组中的相等元素的数量

## 1. method='average’排名

import pandas as pd
import numpy as np

df = pd.Series([3, 4, -2, 1, 4, 5])
print(df)
print(df.rank())

[3, 4, -2, 1, 4, 5]，我们手动排一下，-2是第1名，1是第2名，3是第3，4是第4，4是第5，5是第6。其中两个4的排名分别是4和5，在默认的排法，他们平均数4.5，所以两个排名都是4.5。

## 2. method='min’排名

import pandas as pd
import numpy as np

df = pd.Series([3, 4, -2, 1, 4, 5])
print(df)
print(df.rank(method='min'))

[3, 4, -2, 1, 4, 5]，我们手动排一下，-2是第1名，1是第2名，3是第3，4是第4，4是第5，5是第6。其中两个4的排名分别是4和5，在min排法，他们最小值是4，所以两个排名都是4。

## 3. method='max’排名

import pandas as pd
import numpy as np

df = pd.Series([3, 4, -2, 1, 4, 5])
print(df)
print(df.rank(method='max'))

[3, 4, -2, 1, 4, 5]，我们手动排一下，-2是第1名，1是第2名，3是第3，4是第4，4是第5，5是第6。其中两个4的排名分别是4和5，在max排法，他们最大值是5，所以两个排名都是5。

## 4. method='first’排名

import pandas as pd
import numpy as np

df = pd.Series([3, 4, -2, 1, 4, 5])
print(df)
print(df.rank(method='first'))

[3, 4, -2, 1, 4, 5]，我们手动排一下，-2是第1名，1是第2名，3是第3，4是第4，4是第5，5是第6。其中两个4的排名分别是4和5，在first排法中，相同的数谁先出现谁就排前面。

## 5. method='dense’排名

import pandas as pd
import numpy as np

df = pd.Series([3, 4, -2, 1, 4, 5])
print(df)
print(df.rank(method='dense'))

[3, 4, -2, 1, 4, 5]，我们手动排一下，-2是第1名，1是第2名，3是第3，4是第4，4是第5，5是第6。其中两个4的排名分别是4和5，在dense排法中，相同的数不会站坑位，两个4排名都是4，5排名就是5。

THE END