Pandas系列_DataFrame数据筛选(中)
Pandas中筛选数据的方法真的是五花八门,在上一篇文章中已经介绍了很多常见的取数操作,本文中重点介绍:
- 表达式取数
- query、evel
- filter
- where、mask
扩展阅读
关于pandas的连载文章,请阅读:
模拟数据
下面是完全模拟的一份数据,包含:姓名、性别、年龄、数学、语文、总分、地址共7个字段信息。
1 | import pandas as pd |
下面开始详细介绍6种取数方法:
- 表达式取数
- query()取数
- eval()取数
- filter()取数
- where/mask取数
表达式取数
表达式取数指的是通过表达式来指定一个或者多个筛选条件来取数。
1、指定一个数学表达式
1 | # 1、数学表达式 |
2、取反操作
取反操作是通过符号~来实现的
1 | # 2、取反操作 |
3、指定某个属性的值为具体的数据
1 | # 3、指定具体数据 |
4、不等式表达式
1 | # 4、比较表达式 |
5、逻辑运算符
1 | # 5、逻辑运算符 |
query()函数
使用说明
⚠️在使用的时候需要注意的是:如果我们列属性中存在空格,我们需要使用反引号将其括起来再进行使用。
使用案例
1、使用数值型表达式
1 | df.query('math > chinese > 110') |
1 | df.query('math + chinese > 255') |
1 | df.query('math == chinese') |
1 | df.query('math == chinese > 120') |
1 | df.query('(math > 110) and (chinese < 135)') # 两个不等式 |
2、使用字符型表达式
1 | df.query('sex != "女"') # 不等于女,就是全部男 |
1 | df.query('sex not in ("女")') # 不在女中就是男 |
1 | df.query('sex in ("男","女")') # 性别在男女中就是全部人 |
3、传入变量;变量在使用的时候需要在前面加上@
1 | # 设置变量 |
1 | df.query('math < (`chinese` + @a) / 2') |
eval()函数
eval函数的使用方法和query函数是相同的
1、使用数值型表达式
1 | # 1、数值型表达式 |
1 | df[df.eval('math > 125')] |
1 | df[df.eval('math > 125 and chinese < 130')] |
2、字符型表达式
1 | # 2、字符型表达式 |
3、使用变量
1 | # 3、使用变量 |
filter函数
我们使用filter可以对列名或者行名进行筛选,使用方法:
- 直接指定
- 正则指定
- 模糊指定
其中axis=1指定列名;axis=0指定索引
使用说明
使用案例
1、直接指定属性名
1 | df.filter(items=["chinese","score"]) # 列名操作 |
直接指定行索引
1 | df.filter(items=[2,4],axis=0) # 行筛选 |
2、通过正则指定
1 | df.filter(regex='a',axis=1) # 列名中包含 |
1 | df.filter(regex='^s',axis=1) # 列名以s开始 |
1 | df.filter(regex='e$',axis=1) # 列名以e结束 |
1 | df.filter(regex='3$',axis=0) # 行索引包含3 |
3、模糊指定
1 | df.filter(like='s',axis=1) # 列名中包含s |
1 | df.filter(like='2',axis=0) # 行索引包含2 |
1 | # 同时指定列名和索引 |
where和mask函数
where和mask函数是一对相反的函数,取出来的结果刚好是相反的:
- where:取出满足要求的数据,不满足的显示为NaN
- mask:取出不满足要求的数据,满足的显示为NaN
两种方法都可以将将NaN值设置我们指定的数据
where使用
1 | s = df["score"] |
1 | # where:满足条件的直接显示,不满足的显示为NaN |
我们可以给不满足要求的数据进行赋值:
1 | # 我们可以给不满足的进行赋值 |
看看两组结果的对比:
where函数还可以指定多个条件:
1 | # 符合条件的返回True,不符合的返回False |
选出我们想要的数据:
1 | df[(df.where((df.sex=='男') & (df.math > 125)) == df).name] |
mask函数
mask函数获取到的结果和where是相反的
1 | s.mask(s>=600) # 和where相反:返回的都是小于600的数据 |
1 | s.mask(s>=610, 600) # 不满足条件的赋值为600 |
mask函数接受多个条件:
1 | # 取值和where相反 |
总结
Pandas中取数的方法真的五花八门,太多技巧可以获取到我们想要的数据,有时候不同的方式也可以得到相同的数据。本文中着重介绍的通过表达式和5个函数来取数,下篇文章中将会重点讲解3对函数筛选数据的方法。