pandas中按行或列的值对数据排序的实现
作者:宁萌Julie 时间:2023-09-23 02:32:18
在处理表格型数据时,常会用到排序,比如,按某一行或列的值对表格排序,要怎么做呢?
这就要用到 pandas 中的 sort_values() 函数。
一、 按列的值对数据排序
先来看最常见的情况。
1.按某一列的值对数据排序
以下面的数据为例。
import pandas as pd
df_col = pd.DataFrame({'Name':['Paul','Richard', 'Betty', 'Philip','Anna'],
'course1':[85,83,90,84,85],
'course2':[90,82,79,71,86],
'sport':['basketball', 'Volleyball', 'football', 'Basketball','baseball']},
index=[1,2,3,4,5])
df_col
Name | course1 | course2 | sport | |
---|---|---|---|---|
1 | Paul | 85 | 90 | basketball |
2 | Richard | 83 | 82 | Volleyball |
3 | Betty | 90 | 79 | football |
4 | Philip | 84 | 71 | Basketball |
5 | Anna | 85 | 86 | baseball |
在 sort_values() 函数中设置 by='列名',即可以按这一列值的顺序重新排列行。
df_sort=df_col.sort_values(by='course2')
df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
4 | Philip | 84 | 71 | Basketball |
3 | Betty | 90 | 79 | football |
2 | Richard | 83 | 82 | Volleyball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
如以上结果所示,默认是升序排列。还可以做降序排列,在 sort_values() 函数中设置 ascending=False 即可。例如:
df_sort=df_col.sort_values(by='course2',ascending=False)
df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
1 | Paul | 85 | 90 | basketball |
5 | Anna | 85 | 86 | baseball |
2 | Richard | 83 | 82 | Volleyball |
3 | Betty | 90 | 79 | football |
4 | Philip | 84 | 71 | Basketball |
2. 按多列的值对数据排序
您是否遇到过这种情况:要排序的某一列数据有相同的值,此时结果会怎么样呢?我们来看下面的例子。
df_sort=df_col.sort_values(by='course1')
df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
2 | Richard | 83 | 82 | Volleyball |
4 | Philip | 84 | 71 | Basketball |
1 | Paul | 85 | 90 | basketball |
5 | Anna | 85 | 86 | baseball |
3 | Betty | 90 | 79 | football |
从结果看到,“course1” 有两个相同的值 85,此时会依据 index 的先后顺序排列。
那如果不想按 index 顺序,想要自己设定相同值的排序方式,应该怎么做呢?
可以设置第二列,对于第一列的相同值,参照第二列的值排序。例如:
df_sort=df_col.sort_values(by=['course1','course2'])
df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
2 | Richard | 83 | 82 | Volleyball |
4 | Philip | 84 | 71 | Basketball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
3 | Betty | 90 | 79 | football |
可以看到,by 参数中的第二列 “course2” 只在第一列 “course1” 中有相同值时起作用,因此只有 “Anna” 和 “Paul” 所在的这两行数据位置互换,其它行位置不变。
3. key 参数:设置排序时的数据变换函数
在实际中还可能会遇到这种情况,数据中大小写都有,比如例子数据的 “sport” 列。按这一列对数据排序,结果如下:
df_sort=df_col.sort_values(by=['sport'])
df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
4 | Philip | 84 | 71 | Basketball |
2 | Richard | 83 | 82 | Volleyball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
3 | Betty | 90 | 79 | football |
看结果发现,大写字母排在小写字母前面,因此 “Volleyball” 所在行排在 “baseball” 所在行前面,但这并不是我们想要的排序结果。那应该怎么做,才能按字母顺序排序呢?
可以设置 sort_values() 函数的 key 参数。
df_sort=df_col.sort_values(by=['sport'],key=lambda col:col.str.lower())
df_sort
Name | course1 | course2 | sport | |
---|---|---|---|---|
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
4 | Philip | 84 | 71 | Basketball |
3 | Betty | 90 | 79 | football |
2 | Richard | 83 | 82 | Volleyball |
此时的排序结果就是按字母顺序排列。
4. 修改原数据
前面介绍的操作中,每次都生成了一个新的数据 df_sort,并没有改变原数据。
df_col
Name | course1 | course2 | sport | |
---|---|---|---|---|
1 | Paul | 85 | 90 | basketball |
2 | Richard | 83 | 82 | Volleyball |
3 | Betty | 90 | 79 | football |
4 | Philip | 84 | 71 | Basketball |
5 | Anna | 85 | 86 | baseball |
但是,有时可能数据太大,而原数据后续不再使用。为了节省空间,想直接在原数据上改动。应该怎么办呢?
只要在 sort_values() 函数中设置 inplace=True。
df_col.sort_values(by='course2',inplace=True)
df_col
Name | course1 | course2 | sport | |
---|---|---|---|---|
4 | Philip | 84 | 71 | Basketball |
3 | Betty | 90 | 79 | football |
2 | Richard | 83 | 82 | Volleyball |
5 | Anna | 85 | 86 | baseball |
1 | Paul | 85 | 90 | basketball |
二、 按行的值对数据排序
需要注意的是,这种情况只适用于各列数据类型相同的情况,例如下面例子中的数据,每一列数据都是数值型。而前面例子的数据既有数值型,又有字符型,无法按行的值排序。
df_row = pd.DataFrame({
'course1':[91,85,90,84,92],
'course2':[72,81,76,71,79],
'course3':[93,85,88,94,86]},
index=['Paul','Richard', 'Betty', 'Philip','Anna'])
df_row
course1 | course2 | course3 | |
---|---|---|---|
Paul | 91 | 72 | 93 |
Richard | 85 | 81 | 85 |
Betty | 90 | 76 | 88 |
Philip | 84 | 71 | 94 |
Anna | 92 | 79 | 86 |
按行的值排序时,设置 by 参数为某行的 index 名,并且 axis=1。
df_sort=df_row.sort_values(by='Anna',axis=1)
df_sort
course2 | course3 | course1 | |
---|---|---|---|
Paul | 72 | 93 | 91 |
Richard | 81 | 85 | 85 |
Betty | 76 | 88 | 90 |
Philip | 71 | 94 | 84 |
Anna | 79 | 86 | 92 |
按行值排序在 sort_values() 函数中设置 ascending, key, inplace 等参数的方式都与前面介绍的按列值排序相同。这里仅以按多行的值对数据排序为例。
df_sort=df_row.sort_values(by=['Richard','Paul'],axis=1,ascending=False)
df_sort
course3 | course1 | course2 | |
---|---|---|---|
Paul | 93 | 91 | 72 |
Richard | 85 | 85 | 81 |
Betty | 88 | 90 | 76 |
Philip | 94 | 84 | 71 |
Anna | 86 | 92 | 79 |
参考
1.https://www.geeksforgeeks.org/sort-rows-or-columns-in-pandas-dataframe-based-on-values/#courses
2.https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html
来源:https://blog.csdn.net/applebear1123/article/details/129211252
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
装了 Access 2003 安全更新 (KB981716) 之后 Access 打不开
MySQL GTID主备不一致的修复方案
使用Pycharm创建一个Django项目的超详细图文教程
![](https://img.aspxhome.com/file/2023/7/117987_0s.jpg)
Python random模块的运用详解
python udp如何实现同时收发信息
![](https://img.aspxhome.com/file/2023/2/109952_0s.png)
JS 中对象equals方法的实现
python必学知识之文件操作(建议收藏)
![](https://img.aspxhome.com/file/2023/8/66448_0s.png)
html注释所引起的一系列问题
![](https://img.aspxhome.com/file/UploadPic/200811/4/1011310-54s.gif)
SQL脚本语言学习(黑客篇)
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
SQL Server误设置max server memory的处理方法
![](https://img.aspxhome.com/file/2023/9/122349_0s.png)
python实现手机销售管理系统
![](https://img.aspxhome.com/file/2023/3/81713_0s.jpg)
最基础的Python的socket编程入门教程
详解PyTorch预定义数据集类datasets.ImageFolder使用方法
pycharm 使用心得(三)Hello world!
![](https://img.aspxhome.com/file/2023/6/130606_0s.jpg)
python实现定时播放mp3
![](https://img.aspxhome.com/file/2023/1/128281_0s.png)
详细介绍Python的鸭子类型
PHP面向对象程序设计之类与反射API详解
8大措施帮你构筑Access安全防线
javascript实现不同颜色Tab标签切换效果
![](https://img.aspxhome.com/file/2023/6/56526_0s.jpg)