如何将自定义字符串匹配函数批量应用于DataFrame多列范围?
扩展functionator函数以批量处理多列对
首先,咱们先修复原函数里的一个关键问题:你写的('I50' or 'I51') in row['A0']这种写法是无效的——Python会先计算'I50' or 'I51',结果是'I50',所以实际上只在检查'I50'是否存在,而不是两者任意一个。后面的('F00' or 'F01' or 'F02')也有同样的问题,咱们在重构时一起解决。
接下来,为了实现批量处理多列对的需求,我们可以把匹配规则抽象成一个可配置的字典,然后编写通用的处理函数,最后循环处理所有目标列对。
步骤1:定义可配置的匹配规则
把原函数里的判断逻辑转换成字典,这样后续修改或添加规则会非常方便:
import numpy as np import pandas as pd match_rules = { 'J44': {'required_in_A': {'J44'}}, 'I50': {'required_in_A': {'I50'}}, 'I51': {'required_in_A': {'I50', 'I51'}}, 'F03X': {'required_in_A': {'F00', 'F01', 'F02'}}, 'N18': {'required_in_A': {'N18'}} }
每个键是i_c列中需要匹配的字符串,对应的值是该字符串需要满足的校验规则(这里是Ai列中需要包含的字符串集合)。
步骤2:编写通用的列对处理函数
这个函数接受单行数据、目标列名、校验列名和规则字典,返回处理后的结果:
def process_column_pair(row, target_col, check_col, rules): target_val = row[target_col] check_val = row[check_col] # 遍历所有规则,找到匹配的目标字符串 for target_str, rule in rules.items(): if target_str in target_val: # 检查校验列是否包含规则中的任意一个字符串 if any(req_str in check_val for req_str in rule['required_in_A']): return target_val return np.nan # 没有匹配任何规则,返回nan return np.nan
步骤3:实现批量处理逻辑
编写一个函数,遍历所有需要处理的列对(i_c和Ai,i从0到n-1),对每一列对应用处理函数:
def batch_process(df, num_pairs, rules): for i in range(num_pairs): target_col = f"{i}_c" check_col = f"A{i}" # 确保列存在,避免KeyError if target_col not in df.columns or check_col not in df.columns: print(f"警告:列 {target_col} 或 {check_col} 不存在,跳过处理") continue # 应用处理函数到每一行 df[target_col] = df.apply( lambda row: process_column_pair(row, target_col, check_col, rules), axis=1 ) return df
这里添加了列存在性检查,避免因列名错误导致的异常。
使用示例
假设你需要处理5组列对(0_c/A0到4_c/A4),只需调用:
# 假设你的DataFrame名为df df = batch_process(df, num_pairs=5, rules=match_rules)
为什么这样做?
- 可维护性:规则集中在字典里,新增或修改规则不需要改动函数逻辑
- 通用性:处理函数不绑定特定列名,可复用在任意列对组合
- 正确性:修复了原函数中逻辑判断的错误,确保多字符串校验的有效性
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

