
本文介绍如何高效检测dataframe中某列(如'code')是否存在nan/null值,若存在则提取对应行并保存为csv日志文件;若无空值,则输出验证成功提示,并可进一步将数据写入mysql数据库。
本文介绍如何高效检测dataframe中某列(如'code')是否存在nan/null值,若存在则提取对应行并保存为csv日志文件;若无空值,则输出验证成功提示,并可进一步将数据写入mysql数据库。
在数据预处理与ETL流程中,空值校验是关键的质量控制环节。针对Pandas DataFrame中特定列(如本例的 'Code' 列)进行空值检查,并将异常记录结构化输出至日志文件,是保障下游任务健壮性的常见需求。以下提供一套完整、健壮且符合Python 3.6+规范的实现方案。
✅ 正确检测NaN值的方法
需注意:NaN != NaN 是其核心特性,但不推荐直接用 df.iloc[i, 0] != df.iloc[i, 0] 这种隐式判断(易读性差、且对None或pd.NA等其他缺失值类型不兼容)。应优先使用Pandas内置的 isna() 或 isnull() 方法:
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
import pandas as pd
# 示例数据(已修正原始输入中的格式问题)
df = pd.DataFrame({
'Code': [23.0, 34.0, float('nan'), 56.0, 67.0],
'region': ['AA', 'BB', 'Cc', 'BB', '45'],
'role': ['B', 'C', 'A', 'C', 'C'],
'type': ['Y', 'X', 'Z', 'Y', 'Y']
})
# 检查 'Code' 列是否存在空值
has_nulls = df['Code'].isna().any()
if has_nulls:
# 提取所有 'Code' 为空的完整行(保留原始索引,便于溯源)
null_rows = df[df['Code'].isna()].copy()
# 可选:添加诊断信息列
null_rows['log_timestamp'] = pd.Timestamp.now()
null_rows['validation_column'] = 'Code'
# 写入CSV日志文件(不保存索引,确保列对齐)
null_rows.to_csv('null_code_log.csv', index=False, encoding='utf-8')
print(f"✅ 发现 {len(null_rows)} 行 'Code' 列为空值,日志已保存至 null_code_log.csv")
else:
print("✅ validation successful")
# 此处可执行后续操作,例如写入MySQL
# 示例(需安装 pymysql 或 mysql-connector-python):
# from sqlalchemy import create_engine
# engine = create_engine('mysql+pymysql://user:pass@host:port/dbname')
# df.to_sql('your_table', con=engine, if_exists='append', index=False)
⚠️ 关键注意事项
- 避免使用 == None 或 == np.nan:NaN在数值比较中恒为False,会导致漏检;必须用 isna() / isnull()。
- 保留原始索引:.loc[df['Code'].isna()] 比循环更高效,且自动保留原始行号,利于定位问题数据。
- 日志内容建议:除原始数据外,可增加时间戳、校验字段名、环境信息等,提升可追溯性。
- MySQL写入时机:仅当 has_nulls == False 时触发,确保数据质量达标后再入库,避免脏数据污染。
- 编码兼容性:显式指定 encoding='utf-8' 防止中文列名或内容在Windows系统下乱码。
该方案兼顾可读性、性能与工程实践,适用于生产环境中的数据质量门禁(Data Quality Gate)场景。










