使用Pandas对数据进行筛选和排序的实现


Posted in Python onJuly 29, 2019

筛选和排序是Excel中使用频率最多的功能,通过这个功能可以很方便的对数据表中的数据使用指定的条件进行筛选和计算,以获得需要的结果。在Pandas中通过.sort和.loc函数也可以实现这两 个功能。.sort函数可以实现对数据表的排序操作,.loc函数可以实现对数据表的筛选操作。本篇文章将介绍如果通过Pandas的这两个函数完成Excel中的筛选和排序操作。

使用Pandas对数据进行筛选和排序的实现

首选导入需要使用的Pandas库和numpy库,读取并创建数据表,将数据表命名为lc。

import pandas as pd
import numpy as np
lc=pd.DataFrame(pd.read_csv('LoanStats3a.csv',header=1))

创建数据表后,开始使用Pandas的.sort函数对数据表进行排序操作,下面是Pandas官方对.sort函数语法和使用方法的说明。.sort函数主要包含6个参数,columns为要进行排序的列名称, ascending为排序的方式true为升序,False为降序,默认为true。axis为排序的轴,0表示index,1表示columns,当对数据列进行排序时,axis必须设置为0。inplace默认为False,表示对数据 表进行排序,不创建新实例。Kind可选择排序的方式,如快速排序等。na_position对NaN值的处理方式,可以选择first和last两种方式,默认为last,也就是将NaN值放在排序的结尾。

使用Pandas对数据进行筛选和排序的实现

在了解了.sort函数的语法和使用方法后,我们开始使用这个函数对数据进行排序操作,数据源来自Lending Club 2017-2011年的公开数据。首先对单列数据进行排序。

对单列数据进行排序

升序

单列数据的排序的方法很简单,按照.sort函数中的介绍,写清楚要排序的数据表名称,以及要进行排序的列名称即可。具体的代码和排序结果如下所示,其中lc是前面我们读取并创建的数据表名称,loan_amnt是要进行排序的列名称。这里我们对lc数据表按loan_amnt列进行升序排列。这里需要说明的是ascending参数的默认值是True,也就是升序。因此下面的两种写法效果是一样的 。

lc.sort(["loan_amnt"])
lc.sort(["loan_amnt"],ascending=True)

降序

将ascending参数的值改为False就完成对数据表的降序排列工作。与升序排列的数据表相比可以发现升序排列将loan_amnt列的最小值放在了前面,因此我们可以判断loan_amnt的最小金额为500,与之相反,降序排列将最大值放在了前面,因此loan_amnt的最大金额应该为35000。这里我们没有设置na_position参数的值,因此按默认情况loan_amnt列的NaN值在排序的结尾显示。以下显示了降序排列的代码和结果。

lc.sort(["loan_amnt"],ascending=False)

对多列数据进行排序

除了对单列数据进行排序以外,.sort函数还可以对多列数据进行排序操作。下面我们分别对loan_amnt和int_rate字段进行降序排列,以下是具体的代码和排序结果,与单列数据排序的代码相比,这里只增加了一个新的列名称int_rate。

lc.sort(["loan_amnt","int_rate"],ascending=False)

我们将需要排序的两个列名称互换位置,再次执行降序排列操作。观察两次的排序结果可以发现,这次的结果与之前的结果有一些差异。Loan_amnt字段的排序结果有些混乱,有些较小的值排在了较大值的前面。这是因为第一次排序时loan_amnt是第一排序字段,int_rate是第二排序字段。两个字段交换位置第二次排序后,int_rate变成了第一排序字段,loan_amnt变成了第二排序字段 。

lc.sort(["int_rate","loan_amnt"],ascending=False)

使用Pandas对数据进行筛选和排序的实现

获取金额最小前10项

在完成了对数据表排序的操作后,我们可以对数据表进行简单的筛选,例如获取loan_amnt金额最小的前10名数据。具体的方法是先对lc数据表按loan_amnt升序排列,然后取前10名的数据。NaN值默认在排序结果的结尾显示。以下是具体代码和结果。与前面单列升序排列的代码相比只在结尾增加了.head()函数。

lc.sort(["loan_amnt"],ascending=True).head(10)

获取金额最大前10项

获取金额最大前10项的代码与获取金额最小前10项略有差异,本来我们只需要复制前面的代码,然后将.head()函数改为tail()函数即可,但由于NaN值在排序的尾部,因此,我们将lc数据表按loan_amnt按降序排列,并取排名前10的数据。当然这并不是唯一的方法,我们还可以通过放弃NaN值的排序或者将NaN值在排序前部显示来解决这个问题。以下是具体的代码和执行结果。

lc.sort(["loan_amnt"],ascending=False).head(10)

使用Pandas对数据进行筛选和排序的实现

介绍完排序功能后再来看下筛选,在筛选功能上Pandas使用的是.loc函数。以下是Pandas官方对.loc函数的语法和使用方法的说明。

使用Pandas对数据进行筛选和排序的实现

单列数据筛选并排序

我们使用.loc对lc数据表中grade列为B值的数据条目进行了筛选操作,具体的代码和筛选结果如下。在代码中lc.loc[]是.loc函数的语法,lc[“grade”] == “B”是具体的筛选条件。由于数据表较大,因此在最后使用了head()函数只显示前5行筛选结果。从筛选结果来看grade列的值都为B。

lc.loc[lc["grade"] == "B"].head()

使用Pandas对数据进行筛选和排序的实现

筛选条件除了”等于”(==)以外,还可以使用”不等于”(!=)来排除列中特定的值。我们使用”不等于”来筛选grade列中不是B值的数据条目。以下是具体的代码和筛选结果,可以看到筛选结果中的grade列里已经不包含B值了。

lc.loc[lc["grade"] != "B"].head()

使用Pandas对数据进行筛选和排序的实现

很多时候我们只关注数据表中某几列的数据,这时可以在前面筛选代码的基础上增加要显示的列名称和显示顺序。下面是具体的代码和筛选结果。代码部分与之前相比增加了要显示的列名称 [“member_id”, “loan_amnt”, “grade”]。其余部分均没有改变。在筛选结果的数据表中可以看到仅显示了我们在代码中列出的三列。

lc.loc[lc["grade"] == "B", ["member_id", "loan_amnt", "grade"]].head()

使用Pandas对数据进行筛选和排序的实现

若要对筛选结果进行排序可以联合使用.loc函数和.sort函数。下面的代码中首先对数据表的grade列进行筛选,选择所有值为B的数据,并限定了结果中要显示的三列的名称。最后对筛选出的结果按loan_amnt的金额进行升序排序。

lc.loc[lc["grade"] == "B", ["member_id", "loan_amnt", "grade"]].sort(["loan_amnt"])

使用Pandas对数据进行筛选和排序的实现

在代码后面增加ascending参数,并将值设置为False就可实现对筛选结果的降序排列。以下为具体的代码和筛选及排序结果。

lc.loc[lc["grade"] != "B", ["member_id", "loan_amnt", "grade"]].sort(["loan_amnt"],ascending=False)

使用Pandas对数据进行筛选和排序的实现

多列数据筛选并排序

Pandas的.loc参数还可以同时对多列数据进行筛选,并且支持不同筛选条件逻辑组合。常用的筛选条件包括”等于”(==)”,不等于”(!),”大于”(>)”,小于”(<)”,大于等于”(>=)” ,小于等于”(<=)等等。逻辑组合包括”与”()和”或”()。下面我们将通过3条多列数据筛选代码逐一进行介绍。

第一条代码使用”与”逻辑,筛选出了grade等于B,并且loan_amnt金额大于5000的数据。并限定了显示的列名称。从筛选结果中可以看出grade列的值都是B,loan_amnt的金额均大于5000。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"]>5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].head()

使用Pandas对数据进行筛选和排序的实现

第二条代码也使用”与”逻辑,筛选出了grade不等于B,并且loan_status不等于Charged Off的数据,同时也限定了显示的列名称。从筛选结果中看grade列不包含B值,并且loan_status列不包含Charged Off值。

lc.loc[(lc["grade"] != "B") & (lc["loan_status"] != "Charged Off"),["member_id", "term" , "loan_amnt", "grade", "sub_grade", "loan_status"]].head()

使用Pandas对数据进行筛选和排序的实现

第三条代码使用了”或”逻辑,筛选出了grade列值为B,或loan_amnt列金额大于5000的数据,同时也限定了显示的列名称。从筛选结果来看,grade列除了B值以外还保留了其他的值,而这些值在loan_amnt列的金额均大于5000。换句话说,一条数据只要grade列或loan_amnt列任意之一符合筛选条件,这条数据就会被显示。

lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].head()

使用Pandas对数据进行筛选和排序的实现

多列筛选也可以进行排序,方法与单列筛选后排序基本一样,下面的代码对多列筛选后的结果按loan_amnt列进行升序排序。由于筛选条件中限定了loan_amnt列的值要大于5000,因此排序的结果从5020开始。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"])

使用Pandas对数据进行筛选和排序的实现

对多列筛选结果进行降序排序只需在前面升序排序代码的基础上增加ascending参数,并将值设定为False即可。下面是多列筛选后降序排序的代码和结果。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"],ascending=False)

使用Pandas对数据进行筛选和排序的实现

无论是”与”条件,还是”或”条件都可以在筛选后使用排序。下面代码是对使用了“或”逻辑条件的筛选结果进行降序排序的代码和结果。

lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000), ["member_id", "term" , "loan_amnt", "grade","sub_grade", "int_rate"]].sort(["loan_amnt"],ascending=False)

使用Pandas对数据进行筛选和排序的实现

Pandas中的排序和筛选基本介绍完了,在实际的分析工作中,筛选只是分析过程中的一个步骤,很多时候我们还需要对筛选后的结果进行汇总,例如求和,计数,或计算均值等等。也就是Excel中常用的sumifs和countifs函数。

按筛选条件求和(sumif, sumifs)

在单列筛选的代码后增加求和条件就相当于Excel中的sumif函数的功能。下面的代码在单列筛选的代码后增加了.loan_amnt.sum()的求和字段,表示对数据表中所有grade列值为B的loan_amnt金额求和。

lc.loc[lc["grade"] == "B",].loan_amnt.sum()

使用Pandas对数据进行筛选和排序的实现

除了包含条件外,也可以对排除某一条件的数据求和。下面的代码与之前的正好相反,对数据表中所有grade列值不为B的loan_amnt金额求和。

lc.loc[lc["grade"] != "B",].loan_amnt.sum()

使用Pandas对数据进行筛选和排序的实现

增加一个筛选条件就变成了Excel中的sumifs函数的功能。下面的代码中分别使用了两个条件对数据表进行筛选,并对最后的loan_amnt金额进行求和。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000)].loan_amnt.sum()

使用Pandas对数据进行筛选和排序的实现

按筛选条件计数(countif, countifs)

将前面的.sum()函数换为.count()函数就变成了Excel中的countif函数的功能,下面的代码对数据表中grade列值为B的loan_amnt笔数进行计数。

lc.loc[lc["grade"] == "B"].loan_amnt.count()

使用Pandas对数据进行筛选和排序的实现

与前面代码相反,下面的代码对数据表中grade列值不为B的所有loan_amnt笔数进行计数。

lc.loc[lc["grade"] != "B"].loan_amnt.count()

使用Pandas对数据进行筛选和排序的实现

增加筛选条件,变成了Excel中的countifs函数的功能,下面的代码对数据表中grade列值为B,并且loan_amnt金额额大于5000的loan_amnt笔数进行计数。

lc.loc[(lc["grade"] == "B") & (lc["loan_amnt"] > 5000)].loan_amnt.count()

使用Pandas对数据进行筛选和排序的实现

按筛选条件计算均值(averageif, averageifs)

有了sumifs和countifs,当然也少不了averageifs,在Pandas中.mean()是用来计算均值的函数,将.sum()和.count()替换为.mean()。就是pandas版的averageif和averageifs。下面的代码中计算了数据表中grade列值为B的loan_amnt金额均值。相当于Excel中的averageif函数的功能。

lc.loc[lc["grade"] == "B"].loan_amnt.mean()

使用Pandas对数据进行筛选和排序的实现

与前面的代码证号相反,下面的代码计算了数据表中所有grade列值不为B的loan_amnt金额均值。

lc.loc[lc["grade"] != "B"].loan_amnt.mean()

使用Pandas对数据进行筛选和排序的实现

增加一个筛选条件变成了Excel中的averageifs,不过这里好像又有一些不同,Excel中的sumifs,countifs和averageifs的计算逻辑是满足满足所有指定条件时,才对这些单元格进行求和或计数。而在下面的代码中我们使用了或条件,就是说只要满足两个条件中的任意一个都会进行计算。

lc.loc[(lc["grade"] == "B") | (lc["loan_amnt"] > 5000)].loan_amnt.mean()

使用Pandas对数据进行筛选和排序的实现

按筛选条件获取最大值和最小值

最后两个是Excel中没有的函数功能,就是对筛选后的数据表计算最大值和最小值。方法很简单,将之前的sum()和count()换成max()和min()函数即可。下面是具体的代码和结果。

这条代码是计算数据表中grade列值为B的loan_amnt最大金额。

lc.loc[lc["grade"] == "B"].loan_amnt.max()

使用Pandas对数据进行筛选和排序的实现

这条代码是计算数据表中grade列值不为B的loan_amnt最小金额。

lc.loc[lc["grade"] != "B"].loan_amnt.min()

使用Pandas对数据进行筛选和排序的实现

以上这些也同样支持多条筛选后的计算,在此就不逐一列出了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python高效编程技巧
Jan 07 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
浅谈django开发者模式中的autoreload是如何实现的
Aug 18 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
python for循环remove同一个list过程解析
Aug 14 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 #Python
pycharm修改文件的默认打开方式的步骤
Jul 29 #Python
Python Django Vue 项目创建过程详解
Jul 29 #Python
python cumsum函数的具体使用
Jul 29 #Python
python利用re,bs4,requests模块获取股票数据
Jul 29 #Python
实例详解Python装饰器与闭包
Jul 29 #Python
对于Python深浅拷贝的理解
Jul 29 #Python
You might like
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
php 面向对象的一个例子
2011/04/12 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
js使用心得分享
2015/01/13 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
深入解析Python中函数的参数与作用域
2016/03/20 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
python绘制彩虹图
2019/12/16 Python
用canvas显示验证码的实现
2020/04/10 HTML / CSS
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
客服部工作职责范本
2014/02/14 职场文书
颁奖晚会主持词
2014/03/25 职场文书
计划生育证明书写要求
2014/09/17 职场文书
2014年大学生工作总结
2014/11/20 职场文书
运动与健康自我评价
2015/03/09 职场文书
保险内勤岗位职责
2015/04/13 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技