Pandas 中文手册

9.3 缺失值填充法(最常用,重点)

Pandas缺失值填充法详解 - 高级工程师教你高效处理缺失数据

Pandas 中文手册

本章节详细讲解Pandas中缺失值填充的各种方法,包括固定值填充、统计值填充、前后值填充、插值法和分组填充,附带核心参数和数据类型技巧,适合数据分析和机器学习初学者学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

缺失值填充法详解

引言

在数据分析和机器学习中,缺失值是一个常见问题。Pandas 提供了多种填充缺失值的方法,本教程将介绍最常用和重点的方法,帮助你高效处理数据,提升分析质量。我们将从简单到复杂,逐步讲解各种填充技巧。

1. 用固定值填充

使用 fillna 方法,可以指定一个固定值来填充所有缺失值。这是最简单的填充方式。

import pandas as pd
import numpy as np

# 创建一个示例数据框
df = pd.DataFrame({'A': [1, np.nan, 3, np.nan], 'B': [np.nan, 2, np.nan, 4]})
print('原始数据:')
print(df)

# 用固定值0填充所有缺失值
df_filled = df.fillna(0)
print('用0填充后:')
print(df_filled)

说明: fillna 返回一个新数据框,除非设置 inplace=True 原地修改。

2. 用统计值填充

基于列的统计值,如均值、中位数、众数填充缺失值。这适用于数值型数据,能保持数据分布。

# 使用均值填充列A的缺失值
df['A'] = df['A'].fillna(df['A'].mean())
print('A列用均值填充后:')
print(df)

# 使用中位数填充列B的缺失值
df['B'] = df['B'].fillna(df['B'].median())
print('B列用中位数填充后:')
print(df)

# 使用众数填充(注意:需要导入相关库或计算)
# 假设数据是分类的,可以使用 mode()
df_cat = pd.DataFrame({'C': ['a', 'b', np.nan, 'a']})
df_cat['C'] = df_cat['C'].fillna(df_cat['C'].mode()[0])
print('C列用众数填充后:')
print(df_cat)

3. 用前后值填充

使用向前填充(ffill)或向后填充(bfill),将缺失值用前一个或后一个非缺失值填充。适用于时间序列数据。

# 向前填充:用上一个值填充
df_ffill = df.fillna(method='ffill')
print('向前填充后:')
print(df_ffill)

# 向后填充:用下一个值填充
df_bfill = df.fillna(method='bfill')
print('向后填充后:')
print(df_bfill)

4. 用插值法填充

使用 interpolate 方法进行插值填充,支持线性插值和多项式插值等。适用于数值型数据,能生成更平滑的估计。

# 线性插值:基于相邻值的线性估计
df_interpolated = df.interpolate()
print('线性插值后:')
print(df_interpolated)

# 多项式插值:设置 method='polynomial' 和 order 参数
df_poly = df.interpolate(method='polynomial', order=2)
print('二阶多项式插值后:')
print(df_poly)

5. 按分组填充

结合 groupbyfillna,根据业务分组填充缺失值。例如,按类别填充同组的均值。

# 创建一个有分组列的数据框
df_grouped = pd.DataFrame({'Group': ['X', 'X', 'Y', 'Y'], 'Value': [1, np.nan, 3, np.nan]})
print('原始分组数据:')
print(df_grouped)

# 按组填充缺失值为组的均值
df_grouped['Value'] = df_grouped.groupby('Group')['Value'].transform(lambda x: x.fillna(x.mean()))
print('按组填充均值后:')
print(df_grouped)

6. 填充法的核心参数配置

  • inplace: 布尔值参数,默认为 False。如果设置为 True,则在原数据框上修改,不返回新对象。使用时要小心,避免意外覆盖数据。

    # 原地填充示例
    

df.fillna(0, inplace=True) # 直接修改df


- **limit**: 整数参数,限制填充的连续缺失值数量。例如,`limit=1` 只填充一个缺失值,之后的缺失值保持不变。

```python
# 限制填充数量示例
df_limited = df.fillna(method='ffill', limit=1)

7. 不同数据类型缺失值的填充技巧

数值型数据

  • 填充建议: 使用均值、中位数或插值法,能保持数据统计性质。
  • 示例: 如上文所示。

字符串型数据

  • 填充建议: 使用固定值如 'unknown' 或统计值如众数。注意字符串列可能不适合数值插值。

  • 示例: 使用固定值填充。

    df_str = pd.DataFrame({'Text': ['hello', np.nan, 'world']})
    

df_str['Text'] = df_str['Text'].fillna('missing')


### 日期型数据
- **填充建议**: 使用前后值填充或插值,适用于时间序列。
- **示例**: 向前填充日期。

```python
df_date = pd.DataFrame({'Date': pd.to_datetime(['2023-01-01', pd.NaT, '2023-01-03']), 'Value': [10, np.nan, 30]})
df_date['Value'] = df_date['Value'].fillna(method='ffill')

总结

缺失值填充是数据清洗的重要步骤,Pandas 提供了多种灵活的方法。新人可以从固定值填充入手,逐步学习统计值、前后值和插值填充,再结合实际业务场景使用分组填充。注意核心参数 inplacelimit 的配置,并根据数据类型选择合适的技巧。多加练习,你会成为数据处理的高手!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包