如何批量检查所有Pandas DataFrame是否包含指定正则表达式?
问题:批量筛选包含指定正则表达式的DataFrame(无需遍历列)
我需要检查多个DataFrame,清除其中不包含指定正则表达式的DataFrame,但不确定正则表达式所在的列。请问如何不通过遍历列的方式,检查所有DataFrame是否包含指定正则表达式?
以下是我当前的实现代码:
import pandas as pd import numpy as np import re import codecs # read file folder = 'folder_path' file = 'file_name.html' html_df = pd.read_html(folder + '/' + file) # check dataframes html_match = re.compile(r'_TOM$|_TOD$') # add DF number with html_match df_check = [] for i, df in enumerate(html_df): for col in df.columns: try: if len(df[df[col].str.contains(html_match) == True]) != 0: df_check.append(i) else: continue except AttributeError: continue
优化方案:无需遍历列的实现方式
可以利用Pandas的applymap结合多层any()来实现,不用手动遍历每一列,代码更简洁高效:
import pandas as pd import re # 读取HTML中的所有DataFrame folder = 'folder_path' file = 'file_name.html' html_df = pd.read_html(folder + '/' + file) # 定义目标正则表达式 html_match = re.compile(r'_TOM$|_TOD$') # 筛选包含匹配内容的DataFrame filtered_dfs = [] df_check = [] # 保存符合条件的DataFrame原索引 for idx, df in enumerate(html_df): # 检查整个DataFrame是否有元素匹配正则 # 1. 把每个元素转成字符串,用正则匹配,得到布尔值矩阵 # 2. 第一层any()检查每列是否存在匹配项,第二层any()检查所有列是否有符合条件的 has_match = df.applymap(lambda x: bool(html_match.search(str(x)))).any().any() if has_match: filtered_dfs.append(df) df_check.append(idx)
代码说明
applymap(lambda x: bool(html_match.search(str(x)))):遍历DataFrame的所有元素,先统一转为字符串(避免数字、日期等非字符串类型触发报错),再用正则检查是否匹配,返回一个全是布尔值的DataFrame。.any().any():第一个any()会检查每一列中是否存在至少一个True(即该列有匹配项),第二个any()则检查所有列中是否存在符合条件的列,只要整个DataFrame有一个元素匹配,就会返回True。- 相比原代码,这个方法省去了手动遍历列的步骤,也不需要
try-except捕获异常,逻辑更清晰,执行效率也更高。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

