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方法教你優雅的查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM