Python中基于DataFrame列唯一值数量生成动态if语句
动态生成对应数量if语句的实现方案
要实现根据DataFrame某列唯一值数量n生成2ⁿ-1条if分支(对应所有非空子集组合),可以通过生成所有非空子集+动态构建判断逻辑的方式自动化完成,以下是具体实现:
核心思路
- 提取目标列的所有唯一值,得到数量
n - 生成该唯一值列表的所有非空子集(总数恰好是
2ⁿ-1) - 为每个子集构建对应的if条件与返回逻辑,生成可直接调用的函数
代码实现
自动化生成函数的工具代码
import itertools import pandas as pd def generate_fail_label_func(target_col): """ 根据DataFrame列的唯一值动态生成包含2^n-1条if分支的标签函数 :param target_col: pandas Series,目标DataFrame列 :return: 可直接调用的标签函数,输入行数据返回对应标签 """ unique_vals = target_col.unique() col_name = target_col.name # 生成所有非空子集:从1个元素到n个元素的所有组合 non_empty_subsets = [] for subset_size in range(1, len(unique_vals) + 1): non_empty_subsets.extend(itertools.combinations(unique_vals, subset_size)) def dynamic_label(row): for subset in non_empty_subsets: if row[col_name] in subset: return 'fail_' + '_'.join(map(str, subset)) return 'pass' return dynamic_label
使用示例
假设我们有如下测试数据:
# 测试DataFrame df = pd.DataFrame({ 'product_type': ['electronics', 'clothing', 'home', 'electronics', 'home'] }) # 生成动态函数 label_func = generate_fail_label_func(df['product_type']) # 测试调用 print(label_func({'product_type': 'electronics'})) # 输出: fail_electronics print(label_func({'product_type': 'clothing'})) # 输出: fail_clothing print(label_func({'product_type': 'home'})) # 输出: fail_home # 多元素子集匹配示例(若业务场景允许行值属于多元素集合) print(label_func({'product_type': 'electronics'})) # 优先匹配单元素子集,返回对应标签
自定义调整说明
- 条件逻辑修改:如果需要的不是
in判断,而是其他逻辑(比如多条件与/或),可以修改判断语句。例如针对多列场景的多条件判断:# 假设subset是多列的取值组合,修改判断逻辑 if all(row[col] == val for col, val in zip(col_names, subset)): - 标签格式修改:可以根据业务需求自定义标签生成规则,比如用逗号分隔元素、添加业务前缀等:
return f"reject_{'-'.join(map(str, subset))}" - 分支顺序调整:如果需要优先匹配多元素子集,只需调整
non_empty_subsets的生成顺序,先生成大尺寸子集即可:for subset_size in range(len(unique_vals), 0, -1): non_empty_subsets.extend(itertools.combinations(unique_vals, subset_size))
内容的提问来源于stack exchange,提问作者avantipalli
相关产品推荐
相关产品推荐

