基于Pandas DataFrame自动生成规则判断函数的实现需求
问题描述
给定如下Pandas DataFrame:
import pandas as pd rule_frame = pd.DataFrame({'PA_1' : ['A','B','A'], 'PA_2' : ['Low','Low','Low'], 'LA_1' : ['A','B','E'], 'LA_2' : ['Low','Low']})
需要基于该DataFrame自动生成一个规则判断函数:
- 函数以DataFrame的各列名作为参数
- 当输入参数与DataFrame中任意一行的所有列值完全匹配时返回
True,否则返回False - 实现需具备灵活性,能适配不同的列数和行数
解决方案
可以通过将规则数据预处理为元组集合,再动态生成判断函数的方式实现,同时处理原数据中的缺失值问题:
1. 通用函数生成器
def generate_rule_checker(df): # 获取DataFrame的列名列表 columns = df.columns.tolist() # 将每行数据转为元组,把缺失值替换为None,存入集合(集合查询效率更高) rule_set = set(tuple(row.fillna(None) for row in df.itertuples(index=False, name=None))) def rule_checker(**kwargs): # 按列名顺序提取输入参数,未传入的参数默认用None对应原数据的缺失值 input_tuple = tuple(kwargs.get(col, None) for col in columns) return input_tuple in rule_set return rule_checker
2. 使用示例
# 生成对应rule_frame的判断函数 check_rule = generate_rule_checker(rule_frame) # 测试匹配场景 print(check_rule(PA_1='A', PA_2='Low', LA_1='A', LA_2='Low')) # 输出: True(匹配第一行) print(check_rule(PA_1='B', PA_2='Low', LA_1='B', LA_2='Low')) # 输出: True(匹配第二行) print(check_rule(PA_1='A', PA_2='Low', LA_1='E')) # 输出: True(匹配第三行的缺失值,未传LA_2则默认用None) # 测试不匹配场景 print(check_rule(PA_1='C', PA_2='Low', LA_1='A', LA_2='Low')) # 输出: False print(check_rule(PA_1='A', PA_2='High', LA_1='A', LA_2='Low')) # 输出: False
实现优势
- 适配任意行列数:无论输入的DataFrame有多少列或行,生成器都能自动生成对应的判断函数
- 处理缺失值:原数据中的缺失值会被转为
None,函数调用时未传对应参数或传None都能匹配 - 查询高效:使用集合存储规则,判断匹配的时间复杂度为O(1)
内容的提问来源于stack exchange,提问作者Samet Sökel
相关产品推荐
相关产品推荐

