Python及Pandas中实现通用函数检测伪装为字符串的Null/空值
伪装为字符串的空值检测方案
Pandas原生pd.isna()仅能识别原生空类型(None、np.nan、pd.NaT等),无法识别被存储为字符串的空值标识,硬编码枚举值的写法扩展性差,也无法兼容带前后空格、大小写不统一的脏数据场景,可参考如下实现:
通用检测函数
import pandas as pd import numpy as np def is_custom_null(val): # 优先识别原生空值 if pd.isna(val): return True # 仅对字符串类型做匹配,避免把0、False等合法值误判为空 if isinstance(val, str): # 预处理:去除前后空白、统一转小写,兼容格式不统一的脏数据 cleaned_val = val.strip().lower() # 覆盖常见的字符串类空值标识,可根据业务场景自行增删 null_str_collection = {'', 'none', 'nan', 'null', 'na', 'n/a', 'nat'} return cleaned_val in null_str_collection return False
Pandas场景批量使用方法
- 单列空值筛查:直接对列应用函数即可得到布尔掩码
# 筛查col列中所有空值(含字符串伪装空) null_mask = df['col'].apply(is_custom_null) - 全表空值统一替换:识别所有伪装空值后替换为
np.nan,后续可直接使用Pandas原生的dropna()、fillna()等空值处理方法# 将所有识别到的空值替换为numpy标准空值 df = df.mask(df.applymap(is_custom_null))
适配调整说明
- 若业务数据源存在自定义空值标识(比如
--、暂无、无数据等),直接将对应字符串加入null_str_collection集合即可 - 若业务场景中存在大小写敏感的合法值(比如
NA作为国别编码、Na作为化学元素符号),可移除.lower()逻辑,或在集合中单独指定需要匹配的大小写形式 - 若不需要兼容前后带空格的脏数据,可移除
.strip()预处理逻辑
效果验证
test_samples = [np.nan, None, 'None', 'nan', 'NaN', 'NULL', ' N/A ', '', ' ', '正常内容', 0, False, 123] for sample in test_samples: print(f"输入值: {repr(sample)} | 判定为空: {is_custom_null(sample)}")
运行后所有原生空、字符串伪装空、带格式干扰的空值都会被正确识别,数字0、布尔值False等合法非空值不会被误判。
内容的提问来源于stack exchange,提问作者basigow
相关产品推荐
相关产品推荐

