Python DataFrame忽略空单元格对比列值标记结果问题求助
问题说明
现有包含少量空单元格的数据集,结构如下:
| P | Q | R | S | T | U | result |
|---|---|---|---|---|---|---|
| 4 | 3 | 14 | 20 | 6 | 1 | YES |
| 6 | 18 | 19.2 | ||||
| 6 | 28 | 7 | 21 | YES | ||
| 7 | 21 | 7 | 23 | YES | ||
| 5 | 8 | 5 | 10 | YES |
需求为对比三对列:(P,S)、(Q,T)、(R,U),对比时忽略空单元格,只要三组对比中至少存在一组两列值不匹配,就在result列打印YES。
原有实现代码如下:
a1=((file_1.iloc[:,13]!= file_1.iloc[:,16])& (file_1.iloc[:,13].notna() & file_1.iloc[:,16].notna())) b1=((file_1.iloc[:,14]!= file_1.iloc[:,17]) & (file_1.iloc[:,14].notna() & file_1.iloc[:,17].notna())) c1=((file_1.iloc[:,12] != file_1.iloc[:,15]) & (file_1.iloc[:,12].notna() & file_1.iloc[:,15].notna())) mask9 = (a1|(b1&c1))
该代码无法在所有符合条件的场景下正确输出YES,需要排查问题并给出正确实现。
问题根因
原有代码的最终判断逻辑错误:mask9 = (a1|(b1&c1)) 仅会在两种场景下标记YES:
- P和S列不匹配
- Q和T列不匹配 且 R和U列同时不匹配
完全漏掉了「仅Q和T不匹配、其余对无有效不匹配」「仅R和U不匹配、其余对无有效不匹配」这两类符合要求的场景,自然无法覆盖所有正确结果。另外原代码变量无对应注释,可读性差,后续维护容易出现列对应错误。
正确实现代码
核心逻辑修正:三个不匹配判断为或关系,只要任意一对满足「两列均非空且值不等」,就标记为YES。
# 判断(P,S)对:两列均非空且值不相等 ps_mismatch = file_1.iloc[:,12].notna() & file_1.iloc[:,15].notna() & (file_1.iloc[:,12] != file_1.iloc[:,15]) # 判断(Q,T)对:两列均非空且值不相等 qt_mismatch = file_1.iloc[:,13].notna() & file_1.iloc[:,16].notna() & (file_1.iloc[:,13] != file_1.iloc[:,16]) # 判断(R,U)对:两列均非空且值不相等 ru_mismatch = file_1.iloc[:,14].notna() & file_1.iloc[:,17].notna() & (file_1.iloc[:,14] != file_1.iloc[:,17]) # 任意一对不匹配即标记为YES mask9 = ps_mismatch | qt_mismatch | ru_mismatch # 给result列赋值 file_1.loc[mask9, 'result'] = 'YES'
用提供的样例数据验证,所有符合条件的行都能被正确标记:
- 第二行仅R=18、U=19.2不匹配,其余对存在空值,会被正确标记为YES
- 第四行仅R=21、U=23不匹配,Q和T值相等,会被正确标记为YES
- 第五行仅R=8、U=10不匹配,P和S值相等,会被正确标记为YES
内容的提问来源于stack exchange,提问作者Surya_Jas
相关产品推荐
相关产品推荐

