一、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 filter 篩選標簽
參考鏈接:Pandas過濾-filter函數,query函數的使用
參考鏈接:Pandas - 查詢函數query
