所有文章 > 日积月累 > Pandas fillna:全面解析DataFrame中的缺失值处理
Pandas fillna:全面解析DataFrame中的缺失值处理

Pandas fillna:全面解析DataFrame中的缺失值处理

在数据分析中,处理缺失数据是一项常见但至关重要的任务。缺失数据可能导致不准确的分析和误导性的结论。Pandas 是 Python 中一个强大的数据操作库,提供了名为 fillna 的方法来处理 DataFrame 中的缺失值。本文将深入探讨 fillna 方法,详细介绍其各种参数和实际应用场景,帮助您有效管理数据集中的缺失值。

一、理解缺失数据

在深入研究 fillna 方法之前,首先需要理解什么是缺失数据。在 Pandas 中,缺失数据通常用 NaN(Not a Number)表示,尽管其他占位符如 None 也可以使用。缺失数据可能由于多种原因产生,例如数据输入错误、数据收集不完整或数据损坏。

二、fillna 方法简介

Pandas 中的 fillna 方法用于填充 DataFrame 或 Series 中的缺失值。它提供了多种选项来替换 NaN 值,使其成为数据插补的灵活工具。

基本语法

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
  • value: 标量、字典、Series 或 DataFrame,用于填充缺失值。
  • method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None},默认为 None。用于重新索引的 Series 中填充缺失值的方法。
  • axis: {0 或 ‘index’, 1 或 ‘columns’},默认为 0。指定填充缺失值的轴。
  • inplace: 布尔值,默认为 False。如果为 True,则原地填充。
  • limit: 整数,默认为 None。指定连续填充的最大次数。
  • downcast: 字典,默认为 None。指定向下转换的数据类型。

使用标量值填充

使用 fillna 最简单的方法是用标量值(如 0)替换所有缺失值。

import pandas as pd
import numpy as np

# 示例 DataFrame
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [np.nan, 2, 3, 4],
'C': [1, np.nan, np.nan, 4]
})

# 用 0 填充所有 NaN 值
df_filled = df.fillna(0)
print(df_filled)

输出:

     A    B    C
0 1.0 0.0 1.0
1 2.0 2.0 0.0
2 0.0 3.0 0.0
3 4.0 4.0 4.0

使用字典填充

您还可以使用字典为不同的列指定不同的填充值。

# 为不同列指定不同的填充值
df_filled = df.fillna({'A': 0, 'B': 1, 'C': 2})
print(df_filled)

输出:

     A    B    C
0 1.0 1.0 1.0
1 2.0 2.0 2.0
2 0.0 3.0 2.0
3 4.0 4.0 4.0

使用 Series 填充

您可以使用 Series 来填充缺失值,Series 的索引应与 DataFrame 的列匹配。

# 使用 Series 填充 NaN 值
fill_values = pd.Series({'A': 0, 'B': 1, 'C': 2})
df_filled = df.fillna(fill_values)
print(df_filled)

输出:

     A    B    C
0 1.0 1.0 1.0
1 2.0 2.0 2.0
2 0.0 3.0 2.0
3 4.0 4.0 4.0

使用 DataFrame 填充

同样,您可以使用另一个 DataFrame 来填充缺失值。填充 DataFrame 的索引和列应与原始 DataFrame 匹配。

# 使用另一个 DataFrame 填充 NaN 值
fill_df = pd.DataFrame({
'A': [0, 0, 0, 0],
'B': [1, 1, 1, 1],
'C': [2, 2, 2, 2]
})

df_filled = df.fillna(fill_df)
print(df_filled)

输出:

     A    B    C
0 1.0 1.0 1.0
1 2.0 2.0 2.0
2 0.0 3.0 2.0
3 4.0 4.0 4.0

前向填充和后向填充

fillna 方法还支持前向填充和后向填充,这在处理时间序列数据时非常有用。

  • 前向填充 (ffillpad):用前一个有效值填充缺失值。
  • 后向填充 (bfillbackfill):用后一个有效值填充缺失值。
# 前向填充
df_filled = df.fillna(method='ffill')
print(df_filled)

# 后向填充
df_filled = df.fillna(method='bfill')
print(df_filled)

输出:

     A    B    C
0 1.0 NaN 1.0
1 2.0 2.0 1.0
2 2.0 3.0 1.0
3 4.0 4.0 4.0

A B C
0 1.0 2.0 1.0
1 2.0 2.0 4.0
2 4.0 3.0 4.0
3 4.0 4.0 4.0

限制填充次数

您可以使用 limit 参数限制连续填充的次数。

# 限制填充次数为 1
df_filled = df.fillna(method='ffill', limit=1)
print(df_filled)

输出:

     A    B    C
0 1.0 NaN 1.0
1 2.0 2.0 1.0
2 2.0 3.0 NaN
3 4.0 4.0 4.0

原地填充

如果您希望直接修改原始 DataFrame,可以使用 inplace 参数。

# 原地填充 NaN 值
df.fillna(0, inplace=True)
print(df)

输出:

     A    B    C
0 1.0 0.0 1.0
1 2.0 2.0 0.0
2 0.0 3.0 0.0
3 4.0 4.0 4.0

向下转换数据类型

downcast 参数允许您将填充值的数据类型向下转换以节省内存。

# 向下转换填充值的数据类型
df_filled = df.fillna(0, downcast='infer')
print(df_filled.dtypes)

输出:

A    float64
B float64
C float64
dtype: object

三、高级应用场景

基于分组的缺失值填充

您可以根据分组统计(如均值或中位数)来填充缺失值。

# 示例 DataFrame 包含分组
df = pd.DataFrame({
'Group': ['A', 'A', 'B', 'B'],
'Value': [1, np.nan, np.nan, 4]
})

# 用组的均值填充 NaN 值
df['Value'] = df.groupby('Group')['Value'].apply(lambda x: x.fillna(x.mean()))
print(df)

输出:

  Group  Value
0 A 1.0
1 A 1.0
2 B 4.0
3 B 4.0

使用插值填充缺失值

插值是另一种强大的填充缺失值的技术,尤其适用于时间序列数据。

# 示例 DataFrame 包含时间序列数据
df = pd.DataFrame({
'Date': pd.date_range(start='2023-01-01', periods=5, freq='D'),
'Value': [1, np.nan, np.nan, 4, 5]
})

# 使用线性插值填充 NaN 值
df['Value'] = df['Value'].interpolate()
print(df)

输出:

        Date  Value
0 2023-01-01 1.0
1 2023-01-02 2.0
2 2023-01-03 3.0
3 2023-01-04 4.0
4 2023-01-05 5.0

使用自定义函数填充缺失值

您还可以使用自定义函数根据特定逻辑填充缺失值。

# 示例 DataFrame
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [np.nan, 2, 3, 4],
'C': [1, np.nan, np.nan, 4]
})

# 自定义填充函数
def custom_fill(series):
return series.fillna(series.mean())

# 对每列应用自定义函数
df_filled = df.apply(custom_fill)
print(df_filled)

输出:

     A    B    C
0 1.0 3.0 1.0
1 2.0 2.0 2.5
2 2.333333 3.0 2.5
3 4.0 4.0 4.0

四、结语

处理缺失数据是数据预处理中的关键步骤,Pandas 的 fillna 方法提供了强大的工具来解决这一问题。无论您需要用标量值填充缺失值,还是使用前向或后向填充,或者应用更高级的技术如插值或自定义函数,fillna 都提供了灵活的功能来应对各种场景。

通过掌握 fillna 方法,您可以确保数据集干净且适合分析,从而获得更准确和可靠的洞察。随着您在实际工作中处理更多真实数据,您会发现 fillna 是数据清洗工具箱中不可或缺的工具。