在Python中,填充缺失值(NaN, None等)是数据预处理阶段的一项重要任务。Pandas库提供了几种便捷的方式来处理缺失值。以下是一些常见的方法:
使用
fillna()
函数:fillna()
是Pandas DataFrame和Series对象中用于填充缺失值的函数。填充常数值:
import pandas as pd df = pd.DataFrame({ "A": [1, 2, np.nan, 4], "B": [5, np.nan, np.nan, 8]}) # 使用特定值填充缺失值 df_filled = df.fillna(value=0)
前向填充或后向填充:
# 后向填充(用前一个非缺失值填充) df_filled_backwards = df.fillna(method='bfill') # 前向填充(用下一个非缺失值填充) df_filled_forwards = df.fillna(method='ffill')
使用
SimpleImputer
类(来自scikit-learn库):
在较旧版本的scikit-learn中,SimpleImputer
被用来处理缺失值,例如填充平均数、中位数、最频繁值或者常数值。from sklearn.impute import SimpleImputer import numpy as np imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # 训练 imputer(计算统计量如均值) imp_mean.fit(df) # 应用 imputer 来填充缺失值 df_imputed = pd.DataFrame(imp_mean.transform(df), columns=df.columns)
自从scikit-learn 0.20版本之后,虽然依然可以使用
SimpleImputer
,但Pandas内置的函数已经足够强大,通常情况下直接使用Pandas提供的功能就足够了。使用其他统计方法填充:
你也可以基于列的统计特性来填充缺失值,比如使用列的均值、中位数或众数。df["A"].fillna(df["A"].mean(), inplace=True) # 使用列"A"的平均值填充缺失值 df["B"].fillna(df["B"].mode()[0], inplace=True) # 使用列"B"的众数填充缺失值
注意:
inplace=True
表示直接在原始DataFrame上修改。多重填充策略:
对于不同的列可能需要采用不同的填充策略时,可以通过字典定义填充值。fill_values = { "A": df["A"].mean(), "B": df["B"].median()} df_filled = df.fillna(fill_values)
根据实际需求选择最适合的数据填充策略是非常重要的,因为错误地填充缺失值可能会对后续数据分析和建模产生负面影响。