Pandas DataFrame.loc筛选无法排除空值的问题求助
问题排查与解决方案
先确认空值的真实形态
首先得搞清楚ID和SSID列里的"空值"到底是什么——有可能不是纯粹的空字符串,而是带空格、制表符这类空白字符,导致!= ''判断失效。可以先跑一行代码查看这两列的所有唯一值:
print("ID列唯一值:", results['ID'].unique()) print("SSID列唯一值:", results['SSID'].unique())
针对性解决方案
方案1:处理空白字符后筛选
如果发现有空白字符,先把字符串两端的空白去掉,再做判断:
# 去除列中字符串的首尾空白 results['ID'] = results['ID'].str.strip() results['SSID'] = results['SSID'].str.strip() # 执行筛选(用isin简化多值判断) filtered_data = results.loc[ (results['ID'] != results['SSID']) & (~results['number1'].isin(['8888888888', '9999999999'])) & (results['ID'] != '') & (results['SSID'] != '') ] filtered_data.to_excel(writer, sheet_name='Priority', startrow=1)
方案2:兼顾NaN与空字符串的双重判断
如果之前替换NaN为空字符串的操作没覆盖所有情况(比如还有残留的NaN),可以同时用非空判断和空字符串判断:
import pandas as pd filtered_data = results.loc[ (results['ID'] != results['SSID']) & (~results['number1'].isin(['8888888888', '9999999999'])) & pd.notna(results['ID']) & pd.notna(results['SSID']) & (results['ID'] != '') & (results['SSID'] != '') ] filtered_data.to_excel(writer, sheet_name='Priority', startrow=1)
方案3:用字符串长度判断非空
直接通过字符串长度是否大于0来排除空值(包括空白字符),更稳妥:
filtered_data = results.loc[ (results['ID'] != results['SSID']) & (~results['number1'].isin(['8888888888', '9999999999'])) & (results['ID'].str.len() > 0) & (results['SSID'].str.len() > 0) ] filtered_data.to_excel(writer, sheet_name='Priority', startrow=1)
补充提示
- 用
isin()替代多个!=判断,代码更简洁,后续维护也方便。 - 优先用
results['ID'].unique()确认空值类型,再选对应的方案,避免盲目测试。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

