如何用聚类组均值填充数据集中的缺失值(NA)
聚类分组均值填充缺失值的实现方案
核心思路
先预计算每个聚类组的变量均值,再针对缺失值匹配对应组的均值填充。优先用pandas的向量化操作(比循环高效得多),如果出于学习目的需要循环实现,也可以参考下面的代码。
步骤1:计算各组变量均值
假设你的数据集是df,聚类分组列名为cluster,先计算每组的均值:
import pandas as pd # 按聚类组计算各变量均值 group_means = df.groupby('cluster').mean()
步骤2:高效填充(推荐:向量化操作)
不用循环,用transform直接匹配组均值填充,速度快且代码简洁:
# 对所有含缺失值的列,用对应组的均值填充 df_filled = df.copy() for col in df_filled.columns: if df_filled[col].isna().any(): df_filled[col] = df_filled.groupby('cluster')[col].transform(lambda x: x.fillna(x.mean()))
或者更简洁的写法:
df_filled = df.apply(lambda col: col.fillna(df.groupby('cluster')[col.name].transform('mean')))
步骤3:循环实现(学习/特定需求用)
如果必须用循环遍历每行处理,代码如下:
df_filled = df.copy() # 获取所有存在缺失值的列 na_columns = [col for col in df_filled.columns if df_filled[col].isna().any()] # 遍历每一行(每个国家) for index, row in df_filled.iterrows(): current_cluster = row['cluster'] # 只处理当前行有缺失值的列 for col in na_columns: if pd.isna(row[col]): # 用对应组的均值填充 df_filled.loc[index, col] = group_means.loc[current_cluster, col]
注意事项
- 确保
cluster列没有缺失值,否则填充时会出现匹配错误 - 填充后可以用
df_filled.isna().sum()检查是否还有剩余缺失值 - 该方法仅适用于数值型变量,如果有分类变量缺失,组均值填充不适用,需另行处理
内容的提问来源于stack exchange,提问作者Leandro Sciuto
相关产品推荐
相关产品推荐

