同一DataFrame中对比两列筛选不匹配记录的问题咨询
Pandas 两列值对比筛选不匹配行解决方案
问题原因
原有代码diff = c.loc[~(c['Profit'] == c['Profit1'])]不符合预期,主要是两个常见的Pandas比较逻辑问题:
- 数据类型不匹配:
Profit列是字符串类型,若对比列Profit1是数值类型,即使字面量完全一致,不同类型的值用==直接比较也会返回False,导致误判 - 空值比较规则特殊:Pandas中的NaN和任何值做
==比较都会返回False,包括NaN和自身比较,若两行同一位置都是空值,会被误判为不匹配
修复后的实现代码
写法1(可读性高,适合调试)
# 统一两列数据类型为字符串,同时将空值替换为统一占位符(避免空值比较异常) c['Profit_tmp'] = c['Profit'].astype(str).fillna('__NULL__') c['Profit1_tmp'] = c['Profit1'].astype(str).fillna('__NULL__') # 筛选取值不匹配的行 diff = c.loc[c['Profit_tmp'] != c['Profit1_tmp']].copy() # 删除临时生成的辅助列 diff = diff.drop(columns=['Profit_tmp', 'Profit1_tmp'])
写法2(简化写法,无需修改原表)
diff = c.loc[~( c['Profit'].astype(str).fillna('__NULL__') == c['Profit1'].astype(str).fillna('__NULL__') )]
校验小技巧
如果需要确认类型转换是否正确,可以分别查看两列转换后的取值分布:
print(c['Profit'].astype(str).value_counts(dropna=False))print(c['Profit1'].astype(str).value_counts(dropna=False))
内容的提问来源于stack exchange,提问作者Suraya Zulkifli
相关产品推荐
相关产品推荐

