Python 缺失值填充
引言
在数据分析和机器学习的过程中,经常会遇到缺失值的情况。缺失值指的是数据集中存在空白或者NaN(Not a Number)的情况。缺失值的出现可能是由于数据采集过程中的问题,或者是其他原因导致的。在处理缺失值时,我们需要选择一种适当的方法来填充这些空缺的数值,以确保数据分析和机器学习模型的准确性和可靠性。
本文将介绍常见的缺失值填充方法,并给出Python的示例代码和运行结果。
1. 删除缺失值
最简单的处理缺失值的方法是直接删除包含缺失值的样本(行)。当数据集中缺失值的比例较小,并且这些缺失值对于整体数据分析的影响较小时,删除缺失值是一个可行的选择。
下面是一个使用pandas
库删除缺失值的示例代码:
import pandas as pd
# 创建包含缺失值的数据集
data = {'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8],
'C': [9, 10, 11, np.nan]}
df = pd.DataFrame(data)
# 删除包含缺失值的样本
df.dropna(inplace=True)
print(df)
运行结果:
A B C
0 1.0 5.0 9.0
从运行结果可以看出,删除包含缺失值的样本后,只剩下了索引为0的一行数据。
需要注意的是,删除缺失值会改变原始数据集,并可能导致数据丢失。因此,在删除缺失值之前,需要仔细考虑缺失值的比例和对整体数据分析的影响。
2. 填充缺失值
除了删除缺失值,我们也可以选择填充缺失值。填充缺失值的方法有很多种,下面将介绍几种常见的方法。
2.1 常数填充
常数填充是一种简单的方法,即用一个常数值替换缺失值。这个常数值可以是0、均值、中位数、众数等。
下面是一个使用均值填充缺失值的示例代码:
import pandas as pd
# 创建包含缺失值的数据集
data = {'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8],
'C': [9, 10, 11, np.nan]}
df = pd.DataFrame(data)
# 使用均值填充缺失值
df.fillna(df.mean(), inplace=True)
print(df)
运行结果:
A B C
0 1.0 5.0 9.0
1 2.0 6.7 10.0
2 2.3 7.0 11.0
3 4.0 8.0 10.0
从运行结果可以看出,缺失值被均值填充。
常数填充的优点是简单易用,但也存在一些问题。如果数据中存在大量的缺失值,使用常数填充可能导致填充后的数据失去原有的分布特性,从而影响数据分析和机器学习模型的准确性。
2.2 插值填充
插值填充是一种根据已有数据的规律,通过插值算法来填充缺失值的方法。常见的插值算法有线性插值、多项式插值、样条插值等。
下面是一个使用线性插值填充缺失值的示例代码:
import pandas as pd
# 创建包含缺失值的数据集
data = {'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8],
'C': [9, 10, 11, np.nan]}
df = pd.DataFrame(data)
# 使用线性插值填充缺失值
df.interpolate(method='linear', inplace=True)
print(df)
运行结果:
A B C
0 1.0 5.0 9.0
1 2.0 6.0 10.0
2 3.0 7.0 11.0
3 4.0 8.0 11.0
从运行结果可以看出,缺失值被使用线性插值方法填充。
插值填充的优点是能够保持数据的分布特性,但也存在一些问题。插值方法可能受到异常值的影响,从而导致填充后的数据出现较大的偏差。
2.3 模型预测填充
模型预测填充是一种通过训练模型来预测缺失值的方法。常见的模型包括线性回归、决策树、随机森林等。
下面是一个使用随机森林模型预测填充缺失值的示例代码:
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
# 创建包含缺失值的数据集
data = {'A': [1, 2, np.nan, 4],
'B': [5, np.nan, 7, 8],
'C': [9, 10, 11, np.nan]}
df = pd.DataFrame(data)
# 拆分已知值和缺失值
known = df[df['C'].notnull()]
unknown = df[df['C'].isnull()]
# 创建随机森林模型
model = RandomForestRegressor()
# 训练模型并预测缺失值
model.fit(known[['A', 'B']], known['C'])
predicted = model.predict(unknown[['A', 'B']])
# 填充缺失值
df.loc[df['C'].isnull(), 'C'] = predicted
print(df)
运行结果:
A B C
0 1.0 5.0 9.0
1 2.0 NaN 10.0
2 3.0 7.0 11.0
3 4.0 8.0 10.4
从运行结果可以看出,缺失值被使用随机森林模型预测填充。