使用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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
Python中如何导入类示例详解
Apr 17 Python
Django中如何使用sass的方法步骤
Jul 09 Python
python pandas 时间日期的处理实现
Jul 30 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
python opencv通过4坐标剪裁图片
Jun 05 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 cookie的操作实现代码(登录)
2010/12/29 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
javascript 弹出层组件(升级版)
2011/05/12 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
JavaScript实现滑块验证解锁
2021/01/07 Javascript
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
python爬虫超时的处理的实例
2018/12/19 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
python3 求约数的实例
2019/12/05 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
Python之多进程与多线程的使用
2021/02/23 Python
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
初三开学计划书
2014/04/27 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
投标服务承诺书
2014/05/28 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
2015年见习期工作总结
2014/12/12 职场文书
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python