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

Pandas多布尔条件Excel数据组合匹配异常求助

问题分析与修复方案

核心问题

你的代码存在两个关键错误,导致逻辑不符合需求:

  1. 逻辑判断错误:当前代码是分别判断城市、州、邮编是否各自不在对应列表中(三者同时不满足),但实际需要判断的是三者的组合是否不存在于Excel B的有效组合里,不是单独判断每个字段。
  2. 大小写不匹配:Excel B的城市和州转成了大写,但Excel A的对应字段没有统一大小写,会导致明明匹配的组合因为大小写差异被误判。

另外,np.vectorize并不是Pandas中处理这类问题的最优方式,效率低且容易出错,建议用Pandas原生方法实现。

修复后的代码

# PRE- Check 4: Leer Archivo con US ZipCode.
print('leyendo archivo con ZipCode data...')
df = pd.read_excel(zpath, dtype={"Zip Code": str})
# 创建有效组合的集合:(大写城市, 大写州, 邮编)
valid_combinations = set(
    zip(
        df["Official USPS city name"].str.upper(),
        df["Official USPS State Code"].str.upper(),
        df["Zip Code"]
    )
)
print('Data de ZipCode en memoria...')

# Check 4: Validar City/State/ZipCode.
print("Performing check4...")
# 处理主数据:统一大小写,生成待检查的组合
dataf['City_upper'] = dataf['City'].str.upper()
dataf['State_upper'] = dataf['State'].str.upper()
# 生成组合元组
check_combinations = list(zip(dataf['City_upper'], dataf['State_upper'], dataf['PostalCode']))
# 判断条件:Country为空 且 组合不在有效集合中
result4 = dataf['CountryName'].isna() & ~pd.Series(check_combinations).isin(valid_combinations)
# 清理临时列
dataf.drop(['City_upper', 'State_upper'], axis=1, inplace=True)

failed_reason = update_failed_reason(failed_reason, vadd_failnum(result4, "4, "))
print('Chequeo de Zip/City/State completado..........')

代码说明

  1. 有效组合集合:用zip把Excel B的城市(大写)、州(大写)、邮编打包成元组存入集合,O(1)时间复杂度即可判断组合是否存在,效率远高于循环判断。
  2. 统一大小写:把Excel A的City和State转成大写,避免大小写差异导致的匹配失败。
  3. 正确逻辑判断:
    • dataf['CountryName'].isna():筛选Country为空的行
    • ~pd.Series(check_combinations).isin(valid_combinations):判断组合是否不在有效集合中(~表示取反)
    • 用&连接两个条件,得到最终的失败行标记

测试验证

针对你的测试数据:

  • 完全匹配的行:组合在有效集合中,isin返回True,取反后为False,加上Country为空的条件,最终result4为False(符合预期,不标记为失败)
  • 州信息错误的行:组合不在有效集合中,isin返回False,取反后为True,加上Country为空的条件,最终result4为True(标记为失败,符合需求)

内容的提问来源于stack exchange,提问作者rafael1138

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:53:11