Python学习笔记:利用contains和isin方法筛选数据

时间:2024-03-12 18:50:38

一、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()函数及其逆函数使用