写点什么

Pandas 教程 -4-DataFrame 数据筛选(中)

用户头像
皮大大
关注
发布于: 2 小时前

Pandas 系列_DataFrame 数据筛选(中)

Pandas 中筛选数据的方法真的是五花八门,在上一篇文章中已经介绍了很多常见的取数操作,本文中重点介绍:


  • 表达式取数

  • query、evel

  • filter

  • where、mask



扩展阅读

关于 pandas 的连载文章,请阅读:


1、DataFrame数据筛选_上


2、10种方式创建DataFrame类型数据


3、Series类型数据创建


4、一切从爆炸函数开始

模拟数据

下面是完全模拟的一份数据,包含:姓名、性别、年龄、数学、语文、总分、地址共 7 个字段信息。


import pandas as pdimport numpy as np
df = pd.DataFrame({ "name":['小明','小王','张菲','关宇','孙小小','王建国','刘蓓'], "sex":['男','女','女','男','女','男','女'], "age":[20,23,18,21,25,21,24], "math":[120,130,118,120,102,140,134], "chinese":[100,130,140,120,149,111,118], "score":[590,600,550,620,610,580,634], "address":["广东省深圳市南山区", "北京市海淀区", "湖南省长沙市雨花区", "北京市东城区", "广东省广州市白云区", "湖北省武汉市江夏区", "广东省深圳市龙华区" ]})
df
复制代码



下面开始详细介绍 6 种取数方法:


  1. 表达式取数

  2. query()取数

  3. eval()取数

  4. filter()取数

  5. where/mask 取数

表达式取数

表达式取数指的是通过表达式来指定一个或者多个筛选条件来取数。


1、指定一个数学表达式


# 1、数学表达式df[df['math'] > 125]
复制代码



2、取反操作


取反操作是通过符号~来实现的


# 2、取反操作df[~(df['sex'] == '男')]  # 取出不是男生的数据
复制代码



3、指定某个属性的值为具体的数据


# 3、指定具体数据df[df.sex == '男']  # 等同于 df[df['sex'] == '男']
复制代码



4、不等式表达式


# 4、比较表达式df[df['math'] > df['chinese']]
复制代码



5、逻辑运算符


# 5、逻辑运算符df[(df['math'] > 120) & (df['chinese'] < 140)]
复制代码


query()函数

使用说明


⚠️在使用的时候需要注意的是:如果我们列属性中存在空格,我们需要使用反引号将其括起来再进行使用。

使用案例

1、使用数值型表达式


df.query('math > chinese > 110')
复制代码



df.query('math + chinese > 255')
复制代码



df.query('math == chinese')
复制代码



df.query('math == chinese > 120')
复制代码



df.query('(math > 110) and (chinese < 135)')  # 两个不等式
复制代码



2、使用字符型表达式


df.query('sex != "女"')  # 不等于女,就是全部男
复制代码



df.query('sex not in ("女")')  # 不在女中就是男
复制代码



df.query('sex in ("男","女")')   # 性别在男女中就是全部人
复制代码



3、传入变量;变量在使用的时候需要在前面加上 @


# 设置变量a = df.math.mean()a
df.query('math > @a + 10')
复制代码



df.query('math < (`chinese` + @a) / 2')
复制代码


eval()函数

eval 函数的使用方法和 query 函数是相同的


1、使用数值型表达式


# 1、数值型表达式df.eval('math > 125')   # 得到的是bool表达式
复制代码



df[df.eval('math > 125')]
复制代码



df[df.eval('math > 125 and chinese < 130')]
复制代码



2、字符型表达式


# 2、字符型表达式df[df.eval('sex in ("男")')]
复制代码



3、使用变量


# 3、使用变量b = df.chinese.mean()  # 求均值df[df.eval('math < @b+5')]
复制代码


filter 函数

我们使用 filter 可以对列名或者行名进行筛选,使用方法:


  • 直接指定

  • 正则指定

  • 模糊指定


其中 axis=1 指定列名;axis=0 指定索引

使用说明

使用案例

1、直接指定属性名


df.filter(items=["chinese","score"])   # 列名操作
复制代码



直接指定行索引


df.filter(items=[2,4],axis=0)   # 行筛选
复制代码



2、通过正则指定


df.filter(regex='a',axis=1)  # 列名中包含
复制代码



df.filter(regex='^s',axis=1)  # 列名以s开始
复制代码



df.filter(regex='e$',axis=1)  # 列名以e结束
复制代码



df.filter(regex='3$',axis=0)  # 行索引包含3
复制代码



3、模糊指定


df.filter(like='s',axis=1)   # 列名中包含s
复制代码



df.filter(like='2',axis=0)   # 行索引包含2
复制代码



# 同时指定列名和索引df.filter(regex='^a',axis=1).filter(like='2',axis=0)
复制代码


where 和 mask 函数

where 和 mask 函数是一对相反的函数,取出来的结果刚好是相反的:


  • where:取出满足要求的数据,不满足的显示为 NaN

  • mask:取出不满足要求的数据,满足的显示为 NaN


两种方法都可以将将 NaN 值设置我们指定的数据

where 使用

s = df["score"]s
复制代码



# where:满足条件的直接显示,不满足的显示为NaNs.where(s>=600)
复制代码



我们可以给不满足要求的数据进行赋值:


# 我们可以给不满足的进行赋值s.where(s>=610,600)  # 不满足条件的赋值为600 
复制代码



看看两组结果的对比:



where 函数还可以指定多个条件:


# 符合条件的返回True,不符合的返回Falsedf.where((df.sex=='男') & (df.math > 125))
复制代码



选出我们想要的数据:


df[(df.where((df.sex=='男') & (df.math > 125)) == df).name]# df[(df.where((df.sex=='男') & (df.math > 125)) == df).sex]  效果相同
复制代码


mask 函数

mask 函数获取到的结果和 where 是相反的


s.mask(s>=600)  # 和where相反:返回的都是小于600的数据
复制代码



s.mask(s>=610, 600)  # 不满足条件的赋值为600 
复制代码



mask 函数接受多个条件:


# 取值和where相反df[(df.mask((df.sex=='男') & (df.math > 125)) == df).sex]
复制代码


总结

Pandas 中取数的方法真的五花八门,太多技巧可以获取到我们想要的数据,有时候不同的方式也可以得到相同的数据。本文中着重介绍的通过表达式和 5 个函数来取数,下篇文章中将会重点讲解 3 对函数筛选数据的方法。

发布于: 2 小时前阅读数: 2
用户头像

皮大大

关注

志之所趋,无远弗届,穷山距海,不能限也。 2019.01.15 加入

还未添加个人简介

评论

发布
暂无评论
Pandas教程-4-DataFrame数据筛选(中)