【Python】Pandas数据排序实现

公众号:尤而小屋
作者:Peter
编辑:Peter

在以前的一篇文章   图解Pandas的排序机制sort_values   详细介绍了如何使用pandas的内置函数sort_values来实现数据的排序。本文讲解的是如何使用自定义方式来实现排序:

  • 映射关系实现

  • CategoricalDtype类型实现

d2d49c922b8c4d6e720e716bb89dbe96.png

模拟数据

先模拟一份简单的数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "nick":["aaa","bbb","aba","abc","cac","ccc"],  # 昵称
    "math":[100,120,130,111,100,128],  # 数学
    "english":[140,80,120,90,125,116],  # 英语
    "size":["S","M","L","XS","XL","L"]   # 衣服大小
    })

df
ef6a80c25805de1470dd96fd62bfec41.png

sort_values

DataFrame.sort_values(by, 
               axis=0, 
               ascending=True, 
               inplace=False, 
               kind='quicksort', 
               na_position='last', # last,first;默认是last
               ignore_index=False, 
               key=None)

参数的具体解释为:

  • by:表示根据什么字段或者索引进行排序,可以是一个或多个

  • axis:排序是在横轴还是纵轴,默认是纵轴axis=0

  • ascending:排序结果是升序还是降序,默认是升序

  • inplace:表示排序的结果是直接在原数据上的就地修改还是生成新的DatFrame

  • kind:表示使用排序的算法,快排quicksort,,归并mergesort, 堆排序heapsort,稳定排序stable ,默认是 :快排quicksort

  • na_position:缺失值的位置处理,默认是最后,另一个选择是首位

  • ignore_index:新生成的数据帧的索引是否重排,默认False(采用原数据的索引)

  • key:排序之前使用的函数

下面通过几个简单的例子来复习下sort_values的使用:

单个字段排序

通过nick字段排序,字符串是根据字母的ASCII码;默认是从小到大的升序。第一个字母相同,则比较第二个,类推:

fc108b40d4d9f840dd31f3f9517dba5c.png

根据数值的大小来升序排列:

c8830e25fc13f9f1d86f297c0894e9c6.png

可以将排序方式改为降序:

ff35f533adb27ecf23d99b4279728037.png

多个字段排序

多个字段的同时排序,默认也是升序。当第一个字段的取值相同,再根据第二个字段来升序排列

b0eb9f25d916c9079fcffc03b6b8c364.png

给不同的字段指定不同的排序方式:

a31935d9e0ecd7bc3fbb35553b883d6b.png

再完整地对比下两种不同的方式:

4a7de69a2a232f70e0617262fba02315.png

上面的就是sort_values方法的常见排序方式。

自定义排序

使用sort_values方法排序的时候都是内置的字母或者数值型数据的大小直接来排序,当遇到下面的情况,该如何操作?

当我们根据衣服的大小size来排序,得到的结果是:

5d23d92c05f9b5f45f729555b884a6ae.png

明显这样的排序方式不是我们理想中的样子,在我们的认知中:

  • XS:很小

  • S:小

  • M:中等

  • L:大

  • XL:超大

该如何解决这个问题?提供两种方式:

方法1:通过映射

1、先找到每个size的顺序对应的数值大小

2、生成新的字段order

3、我们对order进行排序

415d92e8570bd6c79805b2829bdbed7f.png 71826f11a25717e1b107a12062374d42.png

方法2:使用CategoricalDtype

CategoricalDtype是具有类别和顺序的分类数据的类型,能够创建我们自定义的排序数据类型。官网地址:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.CategoricalDtype.html

1、指定一个分类的数据类型CategoricalDtype

category_size = pd.CategoricalDtype(
    ['XS', 'S', 'M', 'L', 'XL'], 
    ordered=True)

category_size
8b539c05317cc581083997c324097289.png

2、将size字段设置成上面的CategoricalDtype类型

34d02a1b96da672e931fc00394894237.png

3、我们直接对size使用sort_values就可以达到我们的目的,和上面的map映射的效果是相同的

d7f73185c8baaa3caab931cb17d6ae25.png

而且通过查看df的数据类型,我们也看到size的类型是category:

33329204946b8a9377a02db4c696d40e.png
 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件

本站qq群955171419,加入微信群请扫码:

3566d13cab9bce364f97f4744bc91e02.png

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值