如何统计Pandas中每列缺失值的数量?一个常见问题是:当使用 `isna()` 或 `isnull()` 方法结合 `sum()` 统计缺失值时,若数据量较大或包含多种数据类型(如字符串、数值、时间等),部分列的缺失值可能未被正确识别,尤其是存在空字符串 `' '` 或占位符如 `'N/A'`、`'NULL'` 时。这些值虽非 `NaN`,但实际代表缺失信息,导致统计结果偏低。此外,调用 `df.isna().sum()` 后输出结果若列数较多,难以快速定位缺失严重的字段。如何准确识别各类“伪非空”缺失值,并以清晰方式展示每列缺失数量及占比,是实际数据清洗中的典型挑战。
1条回答 默认 最新
希芙Sif 2026-01-04 16:00关注1. 基础缺失值统计:使用
isna()与sum()在Pandas中,最基础的缺失值统计方式是调用
df.isna().sum()或等价的df.isnull().sum()。这两个方法会返回一个Series,展示每列中标准缺失值(如NaN、None)的数量。import pandas as pd import numpy as np # 示例数据 data = { 'A': [1, 2, np.nan, 4, 5], 'B': ['apple', '', 'banana', 'N/A', None], 'C': [np.nan, 'NULL', '2023-01-01', '2023-01-02', ''], 'D': [10, 20, 30, np.nan, 50], 'E': [None, ' ', 'hello', 'world', 'NULL'], 'F': [pd.NaT, '2023-01-03', '2023-01-04', None, '2023-01-05'], 'G': ['', 'data', 'info', 'test', ''], 'H': [0, 1, 2, 3, 4], 'I': ['N/A', 'null', '', 'valid', 'missing'], 'J': [np.nan, np.nan, np.nan, np.nan, np.nan] } df = pd.DataFrame(data) print(df.isna().sum())输出结果仅能识别真正的
NaN和None,而无法捕捉空字符串或文本型占位符,因此存在统计盲区。2. 深入分析:“伪非空”缺失值的识别
实际业务数据中,常出现以字符串形式存在的缺失标识,例如:
''、'N/A'、'NULL'、'null'、' '?等。这些值虽非NaN,但语义上等同于缺失。需通过自定义逻辑统一转换为NaN再进行统计。- 空字符串:
'' - 空白字符:
' ',' ' - 常见占位符:
'N/A','NULL','null','NA','Missing'
可通过
replace()方法将这些值替换为np.nan。3. 综合缺失值清洗与标准化处理
为了全面识别所有类型的缺失信息,建议在统计前对数据进行预清洗。以下是一个通用函数,用于将多种“伪缺失”值标准化为
NaN:def standardize_missing_values(df, placeholders=None): if placeholders is None: placeholders = ['', 'N/A', 'NULL', 'null', 'NA', 'Missing', ' ', ' '] df_cleaned = df.copy() for col in df_cleaned.columns: if df_cleaned[col].dtype == 'object': df_cleaned[col] = df_cleaned[col].astype(str).str.strip() df_cleaned[col] = df_cleaned[col].replace(placeholders, np.nan) return df_cleaned df_standardized = standardize_missing_values(df) print("标准化后的缺失值数量:") print(df_standardized.isna().sum())4. 缺失值数量与占比的结构化输出
当列数较多时,原始的
sum()输出不易快速判断问题严重性。可构建结构化表格,包含缺失数量、占比,并按占比排序以便优先处理高缺失列。列名 缺失数量 缺失占比(%) A 1 20.0 B 2 40.0 C 2 40.0 D 1 20.0 E 3 60.0 F 2 40.0 G 2 40.0 H 0 0.0 I 3 60.0 J 5 100.0 5. 自动化缺失值分析报告函数
结合上述逻辑,封装一个完整的缺失值分析函数,支持自动清洗、统计、排序和可视化建议。
def missing_report(df, placeholders=None, sort_by='missing_count', ascending=False): df_std = standardize_missing_values(df, placeholders) total = df_std.shape[0] missing_data = pd.DataFrame({ 'column': df_std.columns, 'missing_count': df_std.isna().sum().values, 'missing_ratio': (df_std.isna().sum().values / total) * 100 }) missing_data['missing_ratio'] = missing_data['missing_ratio'].round(2) if sort_by == 'missing_count': missing_data = missing_data.sort_values('missing_count', ascending=ascending) elif sort_by == 'missing_ratio': missing_data = missing_data.sort_values('missing_ratio', ascending=ascending) return missing_data report = missing_report(df, sort_by='missing_ratio', ascending=False) print(report)6. 可视化辅助决策:使用Mermaid流程图描述处理流程
以下是完整缺失值识别与处理的流程逻辑,适用于团队协作与文档说明。
graph TD A[原始DataFrame] --> B{是否存在伪缺失值?} B -- 是 --> C[定义占位符列表] C --> D[使用replace()转换为NaN] D --> E[执行isna().sum()] B -- 否 --> E E --> F[计算缺失占比] F --> G[生成结构化报告] G --> H[按缺失程度排序] H --> I[输出可读性表格或图表]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 空字符串: