Python学习笔记:pd.filter、query筛选数据

一、pd.filter函数

1.介绍

pd.filter 函数根据指定的索引标签对数据框行、或列进行数据筛选(子集查询)。

使用语法为:

DataFrame.filter(items=None, 
                 like=None, -- str
                 regex=None,  -- str
                 axis=None)

类似于 df.loc、df.iloc 函数所实现的功能。

参数说明:

items -- 对列进行筛选 轴标签列表
regex -- 正则匹配
like -- 进行筛选 模糊名查询
axis=0 -- 按行
axis=1 -- 按列

注意:仅按照标签筛选,不对数据内容进行过滤!

2.pd.filter

# 构建测试集
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array(([1,2,3],[4,5,6])),
                  index=['mouse','rabbit'],
                  columns=['one','two','three'])


# 过滤列
df.filter(items=['one','three'])
df.filter(['one'])

# 正则
df.filter(regex='e$', axis=1) # 以e结尾
df.filter(regex='e$', axis=0)
df.filter(regex='Q') # 包含Q

# 相似
df.filter(like='bb', axis=0) # 按行

# 轴标签
df.filter(['one','two'], axis=1)

# 混合使用
df.filter(regex='^r', axis=0).filter(like='o', axis=1) # r开头的行 包含o的列

注意:其中的参数 items/like/regex 被强制执行为相互排斥,只能有一个存在。

3.pd.Series.filter

pd.Series 应用 filter 时参数与 df.filter 一样,不过由于 Series 只有一个轴,不能将 axis = 1,只能按索引查询数据。

df.one.filter(['rabbit'])
df.one.filter(like='e')
df.one.filter(regex='e$')

4.DataFrameGroupBy.filter

分组后进行筛选,可以自定义函数,常与匿名函数 lambda 结合使用。

类似于 SQL 中的 groupby + having 操作。

使用语法为:

DataFrameGroupBy.filter(func, dropna=True, *args, **kwargs)
func -- 用于每个分组
dropna -- 是否删除

实操:

# 构建测试集
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                          'foo', 'bar'],
                   'B' : [1, 2, 3, 4, 5, 6],
                   'C' : [2.0, 5., 8., 1., 2., 9.]})

# 筛选分组后
df.groupby('A').filter(lambda x:x['B'].mean() > 3.)
# 长度
df.groupby('team').filter(lambda x: len(x) >= 3)
# 只要有一个满足
df.groupby(['A']).filter(lambda x: (x['B'] > 3).any())
# 全部满足
df.groupby('A').filter(lambda x: (x.mean() >= 4).all())
# 和满足
df.groupby('A').filter(lambda x: x.Q1.sum() >100)

二、pd.query函数

1.介绍

使用布尔表达式查询 DataFrame 的列,按照某列规则进行过滤。

类似于 SQL 中的 where 进行条件过滤。

使用语法为:

DataFrame.query(expr, inplace=False, **kwargs)
expr -- 查询字符串
inplace -- 是否修改原数据框

2.实操

import pandas as pd 
import numpy as np
df = pd.DataFrame({'A':range(1,6),
                   'B':range(10,0,-2),
                   'C':2})
df
'''
   A   B  C
0  1  10  2
1  2   8  2
2  3   6  2
3  4   4  2
4  5   2  2
'''

df.query('B == 2') # B列等于2
df.query('A < B') # A列小于B列
df[df.A < df.B] # 同上

# 多条件查询
df.query('A < B & A < C')
df.query('A < B | A == 4')

# 部分样例
df.query('A > B > C')
df.query('A + B > 100')
df.query('A == B')
df.query('A != 100')
df.query('A in [3,5]')
df.query('A not in [3,5]')
df.query('name.str.contains("r")') # 好像不支持
df.name.str.contains("r") # 测试没问题
df.query('B == `team name`') # 有空格 反引号

注意:查询条件必须为字符串。

参考链接:pandas filter 筛选标签

参考链接:pandas.DataFrame.filter

参考链接:pandas filter 筛选标签

参考链接:Pandas过滤-filter函数,query函数的使用

参考链接:Pandas - 查询函数query

参考链接:Pandas高级:query方法教你优雅的查询

原文地址:https://www.cnblogs.com/hider/p/15493063.html