Pandas多布尔条件Excel数据组合匹配异常求助
问题分析与修复方案
核心问题
你的代码存在两个关键错误,导致逻辑不符合需求:
- 逻辑判断错误:当前代码是分别判断城市、州、邮编是否各自不在对应列表中(三者同时不满足),但实际需要判断的是三者的组合是否不存在于Excel B的有效组合里,不是单独判断每个字段。
- 大小写不匹配: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..........')
代码说明
- 有效组合集合:用
zip把Excel B的城市(大写)、州(大写)、邮编打包成元组存入集合,O(1)时间复杂度即可判断组合是否存在,效率远高于循环判断。 - 统一大小写:把Excel A的City和State转成大写,避免大小写差异导致的匹配失败。
- 正确逻辑判断:
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
相关产品推荐
相关产品推荐

