排序和排名
import numpy as np
import pandas as pd
1
2
2
# 排序
# 按索引排序
s = pd.Series([3, 2, 1, 4, 5, np.nan], index=['d', 'b', 'a', 'c', 'e', 'f'])
s
1
2
2
d 3.0
b 2.0
a 1.0
c 4.0
e 5.0
f NaN
dtype: float64
s.sort_index() # 默认 ascending=True, 升序
1
a 1.0
b 2.0
c 4.0
d 3.0
e 5.0
f NaN
dtype: float64
df = pd.DataFrame(np.arange(12).reshape(3, 4), index=['C', 'A', 'B'], columns=['c', 'a', 'b', 'd'])
df
1
2
2
c | a | b | d | |
---|---|---|---|---|
C | 0 | 1 | 2 | 3 |
A | 4 | 5 | 6 | 7 |
B | 8 | 9 | 10 | 11 |
df.sort_index() # 默认 axis=0,按 index 排序
1
c | a | b | d | |
---|---|---|---|---|
A | 4 | 5 | 6 | 7 |
B | 8 | 9 | 10 | 11 |
C | 0 | 1 | 2 | 3 |
# 按值排序
注意:按值排序的时候,无论升序还是降序,NaN 值都是放在最后的
s.sort_values()
1
a 1.0
b 2.0
d 3.0
c 4.0
e 5.0
f NaN
dtype: float64
# 单列
df.sort_values('a', ascending=False)
1
2
2
c | a | b | d | |
---|---|---|---|---|
B | 8 | 9 | 10 | 11 |
A | 4 | 5 | 6 | 7 |
C | 0 | 1 | 2 | 3 |
# 多列
df.sort_values(['A', 'B'], axis=1)
1
2
2
c | a | b | d | |
---|---|---|---|---|
C | 0 | 1 | 2 | 3 |
A | 4 | 5 | 6 | 7 |
B | 8 | 9 | 10 | 11 |
# 排名
s1 = pd.Series([7, -5, 7, 4, 2, 0, 4])
s1
1
2
2
0 7
1 -5
2 7
3 4
4 2
5 0
6 4
dtype: int64
s1.rank() # 默认 method='average', 为相同值分配平均排名
1
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
s1.rank(method='first') # 按值在原始数据直中出现的顺序排名
1
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
s1.rank(method='min') # 使用整个分组的最小排名
1
0 6.0
1 1.0
2 6.0
3 4.0
4 3.0
5 2.0
6 4.0
dtype: float64
s1.rank(method='max') # 使用这个分组的最大排名
1
0 7.0
1 1.0
2 7.0
3 5.0
4 3.0
5 2.0
6 5.0
dtype: float64
s1.rank(method='dense') # 类似于min方法,但是排名是在组件加1,并列值出现是不会有“断点”出现
1
0 5.0
1 1.0
2 5.0
3 4.0
4 3.0
5 2.0
6 4.0
dtype: float64
# DataFrame排名
df = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1], 'c': [-2, 5, 8, -3]})
df
1
2
3
2
3
b | a | c | |
---|---|---|---|
0 | 4 | 0 | -2 |
1 | 7 | 1 | 5 |
2 | -3 | 0 | 8 |
3 | 2 | 1 | -3 |
df.rank(method='first')
1
b | a | c | |
---|---|---|---|
0 | 3.0 | 1.0 | 2.0 |
1 | 4.0 | 3.0 | 3.0 |
2 | 1.0 | 2.0 | 4.0 |
3 | 2.0 | 4.0 | 1.0 |
上次更新: 2023/11/01, 03:11:44