You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中利用通配符匹配多列组合

带通配符的多列对账规则匹配方案

针对主数据集匹配带*通配符的多列对账规则的需求,直接合并或笛卡尔积方案不可行时,可通过规则转过滤条件的方式实现高效筛选:

核心思路

将每条对账规则转换为对应的布尔过滤表达式,再通过逻辑或(|)组合所有规则,最终筛选主数据集中符合任意规则的行。这种方式避免了笛卡尔积的内存爆炸问题,仅需遍历数量远小于主数据集的规则集。

具体实现步骤

1. 定义对账规则数据集

假设对账密钥数据集(rules_df)结构如下,*表示对应列无限制:

FirstNameLastNameGender
Angela**
BenJohnsonMale
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:33:24