DataWizardess 2026-01-04 16:00 采纳率: 98.8%
浏览 0
已采纳

如何统计Pandas中每列缺失值的数量?

如何统计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,展示每列中标准缺失值(如 NaNNone)的数量。

    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())
    

    输出结果仅能识别真正的 NaNNone,而无法捕捉空字符串或文本型占位符,因此存在统计盲区。

    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() 输出不易快速判断问题严重性。可构建结构化表格,包含缺失数量、占比,并按占比排序以便优先处理高缺失列。

    列名缺失数量缺失占比(%)
    A120.0
    B240.0
    C240.0
    D120.0
    E360.0
    F240.0
    G240.0
    H00.0
    I360.0
    J5100.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[输出可读性表格或图表]
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 1月5日
  • 创建了问题 1月4日