Pandas比较列时将NULL/NA视为相等的简洁实现问询
Pandas含缺失值的列相等性比较解决方案
问题场景
合并两个DataFrame后,比较对应列的值是否相等,但遇到NA/None等缺失值时,==运算符会返回False,不符合预期。测试代码及输出如下:
测试代码
import pandas as pd # 创建测试DataFrame df_1 = pd.DataFrame({'key': [1, 2, 3, 4, 5], 'field1': ['foo', pd.NA, None, None, 6]}) df_2 = pd.DataFrame({'pk': [1, 2, 3, 4, 6], 'field2': ['foo', pd.NA, pd.NA, None, 6.0]}) # 左连接 df_joined = df_1.merge(df_2, 'left', left_on='key', right_on='pk') # 原有比较逻辑 df_joined['compare'] = df_joined['field1'] == df_joined['field2'] print(df_joined)
原有输出
key field1 pk field2 compare 0 1 foo 1 foo True 1 2 <NA> 2 <NA> False 2 3 None 3 <NA> False 3 4 None 4 None False 4 5 6 5 6.0 True
需要实现让compare列所有值为True的简洁单行写法,不使用apply或自定义函数。
解决方案
使用Pandas的Series.eq()方法,并设置na=True参数,该参数会将两个位置均为缺失值的情况判定为相等:
修改后的比较代码
df_joined['compare'] = df_joined['field1'].eq(df_joined['field2'], na=True)
修改后输出
key field1 pk field2 compare 0 1 foo 1 foo True 1 2 <NA> 2 <NA> True 2 3 None 3 <NA> True 3 4 None 4 None True 4 5 6 5 6.0 True
原理说明
- 原生
==运算符遵循严格相等逻辑,缺失值与任何值(包括自身)比较都会返回False; eq()方法的na=True参数专门适配缺失值场景,当两个对应元素均为NA/None时,直接判定为相等;- 对于数值类型差异(如示例中的
6和6.0),eq()会自动处理类型兼容的相等判断,无需额外转换。
内容的提问来源于stack exchange,提问作者sushi
相关产品推荐
相关产品推荐

