9.3 缺失值填充法(最常用,重点)
Pandas缺失值填充法详解 - 高级工程师教你高效处理缺失数据
本章节详细讲解Pandas中缺失值填充的各种方法,包括固定值填充、统计值填充、前后值填充、插值法和分组填充,附带核心参数和数据类型技巧,适合数据分析和机器学习初学者学习。
缺失值填充法详解
引言
在数据分析和机器学习中,缺失值是一个常见问题。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. 按分组填充
结合 groupby 和 fillna,根据业务分组填充缺失值。例如,按类别填充同组的均值。
# 创建一个有分组列的数据框
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 提供了多种灵活的方法。新人可以从固定值填充入手,逐步学习统计值、前后值和插值填充,再结合实际业务场景使用分组填充。注意核心参数 inplace 和 limit 的配置,并根据数据类型选择合适的技巧。多加练习,你会成为数据处理的高手!