Python學習筆記:利用contains和isin方法篩選數據


一、str.contains方法

1.介紹

contains 方法用於判斷指定系列是否包含指定字符串。類似於 SQL 中的 like 函數,實現模糊匹配。

strSeries 轉換為類似於 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

參考鏈接:pandas的數據篩選之isin和str.contains函數

參考鏈接:pandas中isin()函數及其逆函數使用


免責聲明!

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



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