一、str.contains方法
1.介紹
contains
方法用於判斷指定系列是否包含指定字符串。類似於 SQL 中的 like 函數,實現模糊匹配。
str
將 Series
轉換為類似於 String
的結構。
返回布爾值系列或索引,具體取決於給定模式或正則表達式是否包含在系列或索引的字符串中。
- 使用語法
Series.str.contains(pat, case=True, flags=0, na=None, regex=True)
- 參數
pat -- 字符類型 字符序列或者正則表達式
case -- 布爾類型 是否區分大小寫
flags -- int類型 默認0 標志傳遞到re模塊 比如flags=re.INGNORECASE 等價於 case=False
na -- 默認NaN 填寫缺失值的值 可以隨意指定
regex -- 布爾類型 默認True 假定pat為正則表達式 針對特殊字符需要設置regex=False
2.實操
# 是否包含
import pandas as pd
import numpy as np
s1 = pd.Series(['Mouse', 'dog', 'house and parrot', '23', np.NaN])
s1.str.contains('og', regex=False) # 非正則表達式
使用 case
參數指定區分大小寫
s1.str.contains('oG', regex=True, case=False) # 不區分大小寫
na=True
表示將 NaN 轉換為布爾值 True
na=False
表示將 NaN 轉換為布爾值 False
s1.str.contains('og', regex=True, na=False)
s1.str.contains('og', regex=True, na=True)
s1.str.contains('og', na='100') # 以100填充缺失值
使用帶正則表達式的標志忽略區分大小寫
import re
s1.str.contains('PARROT', flags=re.IGNORECASE, regex=True)
使用正則表達式
# 返回任何數字
s1.str.contains('\d', regex=True)
# 匹配多個
s1.str.contains('house|dog', regex=True)
當 regex
設置為 True 時,確保 pat
不是文字模式。
請注意,在以下示例中,可能只希望 s2[1] 和 s2[3] 返回 True。
但是,作為正則表達式的 “.0” 匹配任何后跟 0 的字符。
s2 = pd.Series(['40', '40.0', '41', '41.0', '35'])
s2.str.contains('.0', regex=True) # 有誤
# 可以通過設置 regex=False 使正則表達式不生效
3.高級用法
構建正則表達式,再進行多個匹配
# 匹配多個
List = ['a', 'b', 'c', 'd']
df['name'].str.contains('|'.join(List)) # 'a|b|c|d' 構建正則表達式
判斷數據框(所有行列)是否包含某關鍵詞
mask = df.select_dtypes(include=[object]).stack().str.contains('key_word').unstack()
df[mask.any(axis=1)] # 按行
# select_dtypes 選擇object類型的字段
# df.any(axis=1) 按行返回所有含有True的行
# .stack() 把N列(N>1)轉換為單列 再用.unstack()還原為N列
二、isin方法
1.介紹
isin
方法用於判斷給定元素是否在給定的列表中,返回布爾序列。
使用語法:
Series.isin(values)
values -- set 或者 list-like
2.實操
# 是否存在
s = pd.Series(['lama', 'cow', 'lama', 'beetle', 'lama', 'hippo'], name='animal')
s.isin(['cow', 'lama'])
'''
0 True
1 True
2 True
3 False
4 True
5 False
Name: animal, dtype: bool
'''
# 直接使用字符串會報錯
s.isin('lama')
# TypeError: only list-like objects are allowed to be passed to isin(), you passed a [str]
s.isin(['lama'])
# 字符串和數值型 無法直接對比
pd.Series([1]).isin(['1']) # False
pd.Series([1.1]).isin(['1.1']) # False
pd.Series([1.1]).isin([1.1]) # True
另外一個例子
df = pd.DataFrame(np.random.randn(4,4),
columns=['A','B','C','D'])
df.A > 0 # 布爾索引
df[df.A >0] # 布爾索引應用 過濾篩選
df.D = [0,1,0,2]
df['E']=['a','a','c','b']
# 多條件、或條件,並不是同時成立
df[df.isin({'D':[0,1],
'E':['a','d']
})]
3.isin逆函數:取不存在元素
不存在 isnotin
函數,直接在 isin
前面添加 ~
即可。
參考鏈接:python: 進階 - 數據預處理 - 數據提取 - 使用str.contains()實現EXCEL的模糊匹配篩選功能
參考鏈接:pandas.Series.str.contains
參考鏈接:pandas.Series.str.contains詳解
參考鏈接:pandas.Series.isin