趋近智
您已使用上一节中的方法,识别出数据集中存在的缺失值(NaN)。现在面临一个决定:您该如何处理它们?忽略缺失数据通常不是一个好的选择,因为大多数分析算法和可视化工具都无法很好地处理 NaN 值。概括来说,您有两种主要的处理方法:移除缺失数据(删除)或用估计值进行补充(填充)。选择哪种方法并不总是显而易见的,它很大程度上取决于具体情况、缺失数据的数量以及您的分析目标。
最直接的方法是直接移除包含缺失值的行或列。
这涉及到移除包含任何列中任何缺失值的整行(观测值)。
在Pandas中,您可以使用 .dropna() 方法轻松删除含有任何 NaN 值的行:
# 假设 'df' 是您的 DataFrame
df_cleaned_rows = df.dropna()
# 检查删除前后的形状
print(f"原始形状: {df.shape}")
print(f"删除含 NaN 行后的形状: {df_cleaned_rows.shape}")
或者,如果某一特定列(特征)含有非常高比例的缺失值,它可能给您的分析提供很少有用信息。在这种情况下,删除整个列可能是一个合理选项。
在Pandas中删除缺失值列时,可以在 .dropna() 方法中指定 axis=1。您还可以使用 thresh 参数来保留至少有特定数量非 NaN 值的列。
# 删除所有值为 NaN 的列
df_cleaned_cols_all_nan = df.dropna(axis=1, how='all')
# 删除缺失值超过 30% 的列
threshold = len(df) * 0.7 # 保留至少有 70% 非 NaN 值的列
df_cleaned_cols_thresh = df.dropna(axis=1, thresh=threshold)
print(f"原始形状: {df.shape}")
# print(f"Shape after dropping columns with all NaN: {df_cleaned_cols_all_nan.shape}")
print(f"删除缺失值超过 30% 的列后的形状: {df_cleaned_cols_thresh.shape}")
填充是指用替代值替换缺失值。这可以保留您的样本量,但会引入人造数据点,可能影响数据的原始分布和关联。简单填充方法在初始 EDA 阶段很常见。
用数值列中观测值的均值替换该列的缺失值。
# 用均值填充 'numerical_col' 中的缺失值
mean_value = df['numerical_col'].mean()
df['numerical_col_mean_imputed'] = df['numerical_col'].fillna(mean_value)
用数值列中观测值的中位数替换缺失值。
# 用中位数填充 'numerical_col' 中的缺失值
median_value = df['numerical_col'].median()
df['numerical_col_median_imputed'] = df['numerical_col'].fillna(median_value)
用列中观测值的众数(最常出现的值)替换缺失值。
Pandas 的 .mode() 方法返回一个 Series(因为可能存在多个众数)。通常,您会使用第一个众数([0])。
# 用众数填充 'categorical_col' 中的缺失值
mode_value = df['categorical_col'].mode()[0]
df['categorical_col_mode_imputed'] = df['categorical_col'].fillna(mode_value)
# 也可以应用于数值列,尽管不常见
# numerical_mode_value = df['numerical_col'].mode()[0]
# df['numerical_col_mode_imputed'] = df['numerical_col'].fillna(numerical_mode_value)
用预定义的常数值替换缺失值,例如 0、-1、“未知”或“缺失”。
# 用 0 填充数值 NaN
df['numerical_col_zero_imputed'] = df['numerical_col'].fillna(0)
# 用 'Unknown' 填充分类 NaN
df['categorical_col_unknown_imputed'] = df['categorical_col'].fillna('Unknown')
那么,您是该删除还是填充?没有普遍答案。考虑以下因素:
实用建议:
首先量化每列和整体缺失数据的程度。如果缺失数据极少,删除可能是最简单的方法。如果更普遍,简单填充(数值型用中位数,分类型用众数)是初始 EDA 的合理起点,让您在进行分析的同时注意可能引入的扭曲。始终记录您选择的方法,因为这是数据准备过程中的重要步骤。如果简单方法不足以应对后续任务(如建模),可以在之后考虑更复杂的填充方法。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造