pin_drop当前位置:知识文库 ❯ 图文
Pandas缺失值处理方法大全 - dropna fillna实战教程
一、缺失值处理概述
在实际数据分析中,缺失值是普遍存在的问题。数据可能因为采集失败、系统错误、用户未填写等原因产生缺失。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)三、参数说明
四、返回值
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)用后一个有效值向前填充,适合需要保持最新值的场景。
本文涉及AI创作
内容由AI创作,请仔细甄别