前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >筛选功能(Pandas读书笔记9)

筛选功能(Pandas读书笔记9)

作者头像
用户1332619
发布2018-04-17 14:46:25
5.8K0
发布2018-04-17 14:46:25
举报
文章被收录于专栏:阿凯的Excel阿凯的Excel

今天和大家分享如果使用Pandas实现单、多条件筛选、模糊筛选。

还是老套路,我们需要先读取一组数据作为测试文件。

测试文件使用读书笔记7的材料,传送门如下:

文件读取功能(Pandas读书笔记7)

分享筛选功能之前,我们先分享如何提取某一列,某一行

一、提取DataFrame数据的某一行

1、显示前N行

使用head函数

2、显示后N行

3、显示任意某一行

这里需要说明pandas数据是从0开始编号的,而我们原始数据是从1开始编号的。

所以使用ix函数的时候,我们输入的是ix[2],选择的是原始数据的第三行

4、显示任意中间行

特殊说明1:选取任意行除了ix函数,loc和iloc均可

特殊说明2:这里不像列表那里有左闭右开的限制。这里两个数字都是闭合的,案例中[7:11]则选取的是第8行至第12行(pandas从0开始编号)

二、提取任意列

1、按照列名提取单列

2、按照列名提取多列

三、提取任意行列数据

1、提取5至9行、列名字为名称的数据

2、提取5至9行、列名字为名称的数据(方法二)

3、提取5至9行、列名字为名称、最高的数据

四、单条件筛选

筛选其实就是将某列符合特殊条件的筛选出来,那我们先设立一个小目标!将涨跌额为正数的筛选出来!

如何判断?无外乎为大于小于等于判断咯!

df['涨跌额']是选出涨跌额这一列

我们看到使用判断后返回的是一个布尔型的数据,是一个TRUE和FALSE的集合体。

那我们如何将这个布尔型的数据实现筛选的功能呢?

我们将这个布尔型数据作为一个参数,外面套上原始数据和中括号即可!就实现了筛选功能。

原理就是布尔型数据为真的话,罗列出来!

五、筛选失败的解决方案

成功的道路总是相同的,不成功的道路各有各的不同,本环节其实才是本篇文章的精华之一,另一个精华就是模糊筛选~~

我们已经实现了根据涨跌额来实现筛选,那根据涨跌幅为正数进行筛选可以吗?

我们先试验一下!

错误提示字面理解就是大于号不能存在在文本和整型之间。

转义一下就是你的原始数据不能是字符串!

常见错误:原始数字使用文本形式存储

所以在这里和大家介绍一下如何强制文本转数字

上述两种方法均可!

细心的朋友肯定会说:“你框我!不是转化涨跌幅咩!怎么搞成涨跌额了!”

发现传统的文本转数字不管用哇!为虾米呢?这个文本转数字只适用于数字以文本形式存储的数据,不适用于本身只能用文本形式存储的数据。(略拗口,可以自己想想~)

由于原始数据带了一个%。所以带%的文本转数字是比较麻烦的~麻烦程度与Excel处理该类问题相同。

那如何解决呢?

df['涨跌幅'] = df['涨跌幅'].str.strip("%").astype(float)/100;

我们使用str.strip("%")函数将原始数据的百分号剔除,然后使用astype(float)将原始数据强制转化为浮点型数据,除以100,让原始数据保持不变;最后使用赋值将更改后的数据重新赋值给涨跌幅那一列。

然后就可以毫无压力的实现目标了!只不过将最初的百分比形式展示的改为了小数。

六、多条件筛选

1、且关系筛选

我们想要得到涨跌幅大于0,且成交量大于1000的数据。

首先涨跌幅大于0怎么表示呢?

df['涨跌幅']>0

成交量大于1000怎么表示呢?

df['成交量']>1000

错误总是那么相似,做个文本转数字吧

pd.to_numeric(df['成交量'])>1000

发现还不行,原来还有这个符号“-”,无法强制转化为数字!

事实证明,工作中的编程其实是处于发现问题,解决问题的过程~

那我们多增加一步,先把-替换掉

pd.to_numeric(df['成交量'].str.strip("-"))>1000

费了九年二虎之力,终于分别实现了不同列的判断条件。

如何把两列混合在一起呢?如何以且关系进行组合判断呢?

df[(df['涨跌幅'] >0)&(pd.to_numeric(df['成交量'].str.strip("-"))>1000)]

我们看一下代码的逻辑,单条件的代码逻辑如下:

变量[变量[列]符合什么条件]

简化就是 变量的中括号内接一个条件

那多条件如何表达呢?

变量[(条件1)&(条件2)&(条件N)]

多条件且关系筛选其实就是将不同条件用括号括起来后使用&字符连接~

2、或关系筛选

前面有了且关系的铺垫,或关系其实就是把&变更为 | 即可!

df[(df['涨跌幅'] >0)|(pd.to_numeric(df['成交量'].str.strip("-"))>1000)]

变量[(条件1)|(条件2)|(条件N)]

七、模糊筛选

模糊筛选想当年也浪费了我不少时间,我以为pandas会自带一个函数来的,结果是使用字符串的形式来实现的~

提问:我们将名称那一列含有“金”字的行提取出来~

Excel实现这个功能很简单,因为可以通过我最喜欢的通配符实现~

pandas只能使用字符串函数find函数,该函数用法与Excel相同~

解释一下这段代码

df[df['名称'].str.find("金", start=0, end=None)>=0]

最外层的df[ ]表示呈现整个表

df['名称'].str.find("金", start=0, end=None)>=0

将名称那一列使用字符串的find函数,如果find的返回值大于0,证明就是含有金字的,如果没有金字,返回值是-1,所以通过该方法可以判断哪行数据含有金字。

嗯嗯,很有才~~~

就这样了~ 感谢支持~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿凯的Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档