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


猜你喜欢
- 1、将python打包好的exe解压为py文件,步骤如下: 下载pyinstxtractor.py文件2、下载地址:https://nchc
- 1、值为列表的构造实例dic = {}dic.setdefault(key,[]).append(value)*********示例如下**
- 12-24小时制编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。输入格式:输入在一行中给出带有中间的:符号(半角的冒号
- 以图像处理见长的微软Live实验室,最近发布了一款新作:Pivot。装完启动后的第一印象就是一款浏览器,和IE、FF、Chrome又不太一样
- pandas删除部分数据后重新索引在使用pandas时,由于隔行读取删除了部分数据,导致删除数据后的索引不连续:原数据删除部分数据后在绑定p
- 两个代码,一个是把python当微信操作,可以查看自己的好友信息,群信息等。还可以定时发送文本,文件等。效果就和你本人操作一样,没差别。还有
- 写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下。方便使用1. C++ 读取文件#include<stdio
- 1.流程控制语 break用于结束整个循环结构,直接退出整个循环例:用两种循环模拟密码输入输入正确就退出循环,输入错误可以重新输入,有三次输
- 今天在写BLOG的Trackback时,需要用到当前页的URL地址,并且包括?后的所有参数。在网上看到以下的这段ASP代码,它的
- 概述路由是自定义url地址执行指定的函数,良好的路由定义可以对seo起到很好的效果。1. 基本路由gin框架封装了http库,提供了 GET
- 内容摘要:在网页制作中,有许多的术语,例如:CSS、HTML、DHTML、XHTML等等。在下面的文章中我们将会用到一些有关于HTML的基本
- 下面给大家介绍下pandas读取CSV文件时查看修改各列的数据类型格式,具体内容如下所述:我们在调bug的时候会经常查看、修改pandas列
- 作者是一名沉迷于Python无法自拔的蛇友,为提高水平,把Python的重点和有趣的实例发在简书上。一、递归是指函数/过程/子程序在运行过程
- 模板图片如下:需识别的图片如下:一、模板预处理1.将模板设置为二值图2.检测模板的轮廓3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储
- 目录1.按照一列数值进行排序1.1按照五缺失值的一列进行排序1.1.1升序排列1.1.2 降序排列1.2按照有缺失值的一列进行排序1.2.1
- 目录1、切片的基础用法2、切片的高级用法3、自定义对象实现切片功能3.1、魔术方法:`getitem()`3.2、自定义序列实现切片功能3.
- 目录1、关键字参数和位置参数(1)关键字参数(2)位置参数2、接受任意数量的参数(1)接受任意数量的位置参数(2)接受任意数量的关键字参数(
- 本文实例讲述了PHP笛卡尔积实现算法。分享给大家供大家参考,具体如下:<?php$arr = array(array(1,3,4,5)
- pyinstaller打包引入自己编写的库场景使用pyinstaller打包某个文件后,生成的exe文件无法运行,提示 Module not
- 一旦获得MySQL服务器的连接,需要选择一个特定的数据库工作。这是因为MySQL服务器可能有一个以上的数据库。从命令提示符,选择MySQL数