使用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操作日期和时间的方法
Mar 11 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
Python常用模块之requests模块用法分析
May 15 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
Python利用命名空间解析XML文档
Aug 10 Python
Python 处理日期时间的Arrow库使用
Aug 18 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 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执行速度全攻略(下)
2006/10/09 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
Python中random模块生成随机数详解
2016/03/10 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
Python中文编码知识点
2019/02/18 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
办公室文秘岗位职责
2013/11/15 职场文书
公司清洁工岗位职责
2013/12/14 职场文书
公司年底活动方案
2014/08/17 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
介绍长城的导游词
2015/01/30 职场文书
村官2015年度工作总结
2015/10/14 职场文书