如何在Pandas DataFrame中利用通配符匹配多列组合
带通配符的多列对账规则匹配方案
针对主数据集匹配带*通配符的多列对账规则的需求,直接合并或笛卡尔积方案不可行时,可通过规则转过滤条件的方式实现高效筛选:
核心思路
将每条对账规则转换为对应的布尔过滤表达式,再通过逻辑或(|)组合所有规则,最终筛选主数据集中符合任意规则的行。这种方式避免了笛卡尔积的内存爆炸问题,仅需遍历数量远小于主数据集的规则集。
具体实现步骤
1. 定义对账规则数据集
假设对账密钥数据集(rules_df)结构如下,*表示对应列无限制:
| FirstName | LastName | Gender |
|---|---|---|
| Angela | * | * |
| Ben | Johnson | Male |
| Debbie | * | Female |
2. 生成每条规则的过滤条件
遍历规则数据集的每一行,针对非*的列生成等值判断,再将同一行的多个条件用逻辑与(&)组合:
import pandas as pd # 构造示例主数据集 main_df = pd.DataFrame({ 'FirstName': ['Angela', 'Ben', 'Ben', 'Debbie', 'David'], 'LastName': ['Smith', 'Johnson', 'Williams', 'Brown', 'Wilson'], 'Gender': ['Female', 'Male', 'Male', 'Female', 'Male'], 'OtherCol': ['val1', 'val2', 'val3', 'val4', 'val5'] }) # 构造对账规则数据集 rules_df = pd.DataFrame({ 'FirstName': ['Angela', 'Ben', 'Debbie'], 'LastName': ['*', 'Johnson', '*'], 'Gender': ['*', 'Male', 'Female'] }) # 生成所有规则的过滤条件 filter_conditions = [] for _, rule in rules_df.iterrows(): conds = [] # 遍历当前规则的所有列,收集非*的等值条件 for col in rules_df.columns: if rule[col] != '*': conds.append(main_df[col] == rule[col]) # 组合当前规则的所有条件(逻辑与) rule_condition = conds[0] for cond in conds[1:]: rule_condition = rule_condition & cond filter_conditions.append(rule_condition) # 组合所有规则的条件(逻辑或) final_condition = filter_conditions[0] for cond in filter_conditions[1:]: final_condition = final_condition | cond # 筛选符合规则的行 matched_df = main_df[final_condition] print(matched_df)
3. 结果验证
运行上述代码后,matched_df将返回符合任意规则的行:
- Angela的所有记录
- Ben+Johnson+Male的记录
- Debbie+Female的记录
扩展优化
- 规则数量较多时,可使用
functools.reduce简化条件组合代码 - 若需支持
*作为字符串模糊匹配通配符,可将等值判断替换为str.contains(需转义正则特殊字符) - 每日执行时,可提前将规则预处理为可复用的过滤表达式,提升执行效率
内容的提问来源于stack exchange,提问作者Laithan Morisco-Tarr
相关产品推荐
相关产品推荐

