Pandas使用.loc过滤DataFrame返回意外结果及None值过滤问题
问题原因
- pandas中使用
==、!=运算符做值比较时,只要操作数包含np.nan(你表格里标注的NAN),比较结果会直接返回False,哪怕两边都是缺失值也不会按照正常逻辑判断是否相等。你使用的object类型列中,None会被自动兼容处理为np.nan,同样会触发该规则。 - 你示例中的行包含多个缺失值,用
!=比较返回的结果不符合预期的筛选逻辑,最终导致该行被误返回。
解决方案
1. 修正过滤逻辑
如果要正确比较两列是否不等(两边同为缺失值时视为相等,仅一侧缺失或值不同时视为不等),优先使用pandas内置的ne()方法,修正后的代码如下:
df = merged_df.loc[(merged_df['Areacode_1'].ne(merged_df['Areacode_2'])) & (merged_df['loc_1'].ne(merged_df['loc_2']))]
如果需要更灵活的判断规则(比如明确控制仅一侧缺失的行是否要被筛选出来),可以结合isna()方法自定义条件:
# 条件1:Areacode两列值不等 或 两列缺失状态不一致 cond1 = (merged_df['Areacode_1'] != merged_df['Areacode_2']) | (merged_df['Areacode_1'].isna() != merged_df['Areacode_2'].isna()) # 条件2:loc两列值不等 或 两列缺失状态不一致 cond2 = (merged_df['loc_1'] != merged_df['loc_2']) | (merged_df['loc_1'].isna() != merged_df['loc_2'].isna()) df = merged_df.loc[cond1 & cond2]
2. 单独筛选缺失值的正确写法
你之前过滤None返回空的问题,是因为不能用== None或== "None"判断pandas中的缺失值,统一使用isna()/isnull()方法即可:
# 筛选Areacode_1为缺失值的行 df_na = merged_df.loc[merged_df['Areacode_1'].isna()]
内容的提问来源于stack exchange,提问作者aero8991
相关产品推荐
相关产品推荐

