今天和大家分享如果使用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,所以通过该方法可以判断哪行数据含有金字。
嗯嗯,很有才~~~
就这样了~ 感谢支持~