如何批量检索遵循递增命名规则的DataFrame列中的字符串,简化重复代码
解决方案
你可以完全不用写冗余的重复判断,两种实现方式都能达到和你原有代码完全一致的效果:
方式1:更简洁的向量化写法(推荐,无需显式写for循环)
首先生成你要检索的目标列列表,你原有代码是从name2检索到name40:
import pandas as pd # 生成目标列名列表 target_cols = [f'name{i}' for i in range(2, 41)] # 你的待检索字符串列表,把50个字符串都放这里 search_strings = ["String001", "String002", ...]
如果是单字符串检索(比如只查String001):
criteria = df[target_cols].apply(lambda col: col.str.contains("String001", na=False)).any(axis=1)
如果是要匹配50个字符串中的任意一个,直接拼接正则表达式一次匹配,效率更高:
# 把所有待检索字符串拼接为正则的或关系 match_pattern = '|'.join(search_strings) # 任意一列包含任意一个待检索字符串就返回True criteria = df[target_cols].apply(lambda col: col.str.contains(match_pattern, na=False, regex=True)).any(axis=1)
代码里的any(axis=1)等价于你原有代码里所有列判断结果用|连接的逻辑。
提示:如果你的待检索字符串包含
.、*这类正则特殊字符,拼接pattern的时候要先转义:import re match_pattern = '|'.join(re.escape(s) for s in search_strings)
方式2:用for循环实现
如果你需要显式用for循环实现,逻辑也很简单:
target_cols = [f'name{i}' for i in range(2, 41)] # 初始化全为False的布尔序列 criteria = pd.Series([False]*len(df), index=df.index) for col in target_cols: # 每列的匹配结果用或逻辑合并 criteria |= df[col].str.contains("String001", na=False)
如果要为每个待检索字符串单独生成匹配结果,再加一层循环即可:
result = {} for s in search_strings: result[s] = df[target_cols].apply(lambda col: col.str.contains(s, na=False)).any(axis=1)
内容的提问来源于stack exchange,提问作者Natrilix
相关产品推荐
相关产品推荐

