看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
排序是数据分析的一种手段,Pandas 支持三种排序方式:按索引标签排序,按列值排序以及两者结合进行排序。
注:本文所使用的 df
和 s
是数据信息一文中的数据。
sort_index()
可将索引重新排序,意味着每行数据的位置跟着索引而变化。
s.sort_index() # 升序排列
df.sort_index() # df 也是按索引进行排序
df.team.sort_index()
s.sort_index(ascending=False) # 降序排列
s.sort_index(inplace=True) # 排序后生效,改变原数据
# 索引重新0-(n-1) 排, 很有用,可以得到它的排序号
s.sort_index(ignore_index=True)
s.sort_index(na_position='first') # 空值在前,另 ‘last’
s.sort_index(level=1) # 如果多层,排一级
s.sort_index(level=1, sort_remaining=False) # 这层不排
# 行索引排序,表头排序
df.sort_index(axis=1) # 会把列按列名顺序排列
df.reindex()
指定自己定义顺序的索引,实现行和列的顺序重新定义:
df = pd.DataFrame({
'A': [1,2,4],
'B': [3,5,6]
}, index=['a', 'b', 'c']
)
df
'''
A B
a 1 3
b 2 5
c 4 6
'''
# 按要求重新指定索引顺序
df.reindex(['c', 'b', 'a'])
'''
A B
c 4 6
b 2 5
a 1 3
'''
# 指定列顺序
df.reindex(['B', 'A'], axis=1)
'''
B A
a 3 1
b 5 2
c 6 4
'''
数据值的排序主要使用 sort_values()
,数值按大小顺序,字符按字母顺序。
s.sort_values() # 升序
s.sort_values(ascending=False) # 降序
s.sort_values(inplace=True) # 修改生效
s.sort_values(na_position='first') # 空值在前
# df 按指定字段顺序
df.sort_values(by=['team'])
df.sort_values('Q1')
# 按多个字段,先排 team, 在同 team 内再看 Q1
df.sort_values(by=['team', 'Q1'])
# 全降序
df.sort_values(by=['team', 'Q1'], ascending=False)
# 对应指定team升Q1降
df.sort_values(by=['team', 'Q1'], ascending=[True, False])
# 索引重新0-(n-1) 排
df.sort_values('team', ignore_index=True)
有些时间就需要索引和值混合排序,比如先按名字排序同序的再按团队排:
df.set_index('name', inplace=True)
df.index.names = ['s_name']
df.sort_values(by=['s_name', 'team'])
# 以下方法也可以实现上述需求,不过要注意顺序
df.set_index('name').sort_values('team').sort_index()
以上方法也适用于多层索引。
# 以下多层索引示例,a 为一级 a1 为 a 下边的二级索引
df1.sort_values(by=('a', 'a1'))
df.rank()
可以生成数据的排序值,典例的例子如学生的成绩表,给出排名。
# 排名, 将值变了序号数
df.rank()
df.rank(axis=1) # 横向排名
# 相同值的排名处理:
# method='average' 并列第1 计算(1+2)/2=都是1.5,下个是3
# method='max':并列第1,显示2,下个 3
# method='min':并列第1,显示1,下个3
# method='dense':并列第1,显示1,下个 2
# method='first':按索引顺序看谁在索引前
df.Q1.rank(method='max')
df.rank(na_option='bottom') # 把空值放在最后
df.rank(pct=True) # 以百分比形式返回
也可以用 nsmallest() 和 nlargest() 来实现排序(只支持数字):
s.nsmallest(3) # 最小的三个
s.nlargest(3) # 最大的三个
# 指定列
df.nlargest(3, 'Q1')
df.nlargest(5, ['Q1', 'Q2'])
df.nsmallest(5, ['Q1', 'Q2'])
Series 还有一个 searchsorted 方法,用于假定在一个单调的序列中增加一个值,这个值所处的索引位置:
ser.searchsorted(10)
# 10
ser.searchsorted([0, 4])
# array([0, 3])
ser.searchsorted([1, 3], side='right')
# array([1, 3])
更新时间:2024-08-13 09:49:14 标签:pandas 排序