pin_drop当前位置:知识文库 ❯ 图文

Pandas缺失值处理方法大全 - dropna fillna实战教程

Pandas DataFrame缺失值处理完整教程

一、缺失值处理概述

在实际数据分析中,缺失值是普遍存在的问题。数据可能因为采集失败、系统错误、用户未填写等原因产生缺失。pandas提供了完善的缺失值处理机制,包括检测、删除、填充和插值等方法。

pandas中使用NaN(Not a Number)表示缺失值。正确处理缺失值是数据清洗的关键步骤,直接影响后续分析的准确性。


二、语法详解

缺失值处理涉及多个核心方法:

代码示例

# 检测缺失值
df.isnull()          # 返回布尔型DataFrame,True表示缺失
df.notnull()         # 返回布尔型DataFrame,True表示非缺失
df.isna()            # 与isnull()等价

# 删除缺失值
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

# 填充缺失值
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None)

# 插值填充
df.interpolate(method='linear', axis=0, limit=None, inplace=False)

三、参数说明

方法 参数 说明
dropna() axis 0=删除含缺失值的行,1=删除列,默认0
how 'any'=有缺失就删除,'all'=全缺失才删除
thresh 保留至少N个非缺失值的行/列
subset 只在指定列中检查缺失值
inplace 是否原地修改,默认False
fillna() value 用于填充的值,可以是标量/字典/Series
method 'ffill'=前向填充,'bfill'=后向填充
limit 最多填充的缺失值数量
inplace 是否原地修改,默认False

四、返回值

isnull()/notnull()返回与原DataFrame同形状的布尔型DataFrame;dropna()返回删除缺失值后的新DataFrame;fillna()interpolate()返回填充后的新DataFrame。当设置inplace=True时返回None。


五、代码示例

示例1:基本用法

代码示例

import pandas as pd
import numpy as np

# 创建含缺失值的数据
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '孙七'],
    '年龄': [25, np.nan, 30, np.nan, 28],
    '薪资': [8000, 9000, np.nan, 11000, np.nan],
    '部门': ['技术部', '市场部', '技术部', np.nan, '人事部']
})

# 检测缺失值
print(df.isnull())
print(df.isnull().sum())  # 统计每列缺失值数量

# 删除含缺失值的行
df_clean = df.dropna()
print(df_clean)

# 删除全为缺失值的列
df_clean2 = df.dropna(axis=1, how='all')

示例2:进阶用法

代码示例

# 使用固定值填充
df_filled1 = df.fillna(0)

# 使用列均值填充数值列
df['年龄'].fillna(df['年龄'].mean(), inplace=True)

# 使用不同值填充不同列
df_filled2 = df.fillna({
    '年龄': df['年龄'].median(),
    '薪资': df['薪资'].mean(),
    '部门': '未知'
})

# 前向填充和后向填充
df['薪资'].fillna(method='ffill', inplace=True)  # 用前一个值填充
df['薪资'].fillna(method='bfill', inplace=True)  # 用后一个值填充

# 插值法填充(适合时间序列)
df['年龄'].interpolate(method='linear', inplace=True)

示例3:实际应用

代码示例

# 模拟真实业务场景中的缺失值处理
data = pd.DataFrame({
    '日期': pd.date_range('2024-01-01', periods=30, freq='D'),
    '访问量': [100, 120, np.nan, 150, np.nan, np.nan, 180, 200, np.nan, 190],
    '转化率': [0.05, np.nan, 0.06, 0.07, np.nan, 0.08, np.nan, 0.09, 0.10, np.nan],
    '订单数': [5, 8, np.nan, 12, np.nan, np.nan, 15, 18, np.nan, 17]
})

# 策略1:访问量缺失超过50%的行删除
data = data.dropna(subset=['访问量'], thresh=5)

# 策略2:转化率用前向填充
data['转化率'].fillna(method='ffill', inplace=True)

# 策略3:订单数用线性插值
data['订单数'].interpolate(method='linear', inplace=True)

# 剩余少量NaN用0填充
data.fillna(0, inplace=True)
print(data)

六、实际应用场景

  • 电商数据分析:处理用户行为数据中的缺失浏览时长、跳出率等指标

  • 金融数据分析:填充股票价格历史数据中的停牌日缺失值

  • 用户调研分析:处理问卷数据中未填写的回答项


七、注意事项

注意1:使用inplace=True时操作不可逆,建议先备份原始数据或使用默认返回新DataFrame的方式。

注意2:填充缺失值时要根据业务逻辑选择合适的方法。时间序列数据适合插值,分类数据适合众数填充,不要盲目使用均值填充。

提示:在处理缺失值前,务必先分析缺失原因。如果是系统性缺失(如某设备故障导致大量数据缺失),简单填充可能引入偏差。


八、小结

  • isnull()notnull()用于检测缺失值

  • dropna()删除缺失数据,fillna()填充缺失数据

  • 根据数据特征和业务场景选择最合适的缺失值处理策略


九、练习题

练习1

创建一个包含多种缺失情况的DataFrame,分别使用dropna()的不同参数策略进行清理,对比结果差异。

练习2

编写一个函数,自动分析DataFrame各列的缺失比例,并根据列类型自动选择填充策略(数值列用中位数,分类列用众数)。

练习3

对比均值填充、中位数填充、KNN填充(sklearn)对后续建模效果的影响,用同一数据集进行测试。

常见问题

什么时候应该删除缺失值,什么时候应该填充?

当缺失比例很低(<5%)且数据量充足时可以直接删除;当缺失比例较高或删除会导致样本严重不足时应该填充。关键列(如标签列)的缺失通常应该删除对应行。

NaN和None有什么区别?

在pandas中,数值列的缺失值用NaN表示,对象列的缺失值可能用None表示。两者在isnull()检测中都会返回True,但在数值计算中只有NaN会被识别为缺失。

如何查看数据集中缺失值的整体分布?

使用df.isnull().sum() / len(df)可以计算每列缺失比例,也可以使用missingno库进行可视化展示。

ffill和bfill填充方法有什么区别?

ffill(forward fill)用前一个有效值向后填充,适合时间序列数据;bfill(backward fill)用后一个有效值向前填充,适合需要保持最新值的场景。

标签: pandas 缺失值处理 数据清洗 fillna dropna Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pandas透视表pivot_table完整教程 - 数据分析必备技能 下一篇: Pandas数据类型转换详解 - astype to_numeric教程

poll相关推荐