如何按条件填充DataFrame缺失值:非全空列用均值,全空列填0?
解决方案
你的代码问题在于没有对每一列单独做判断,当前逻辑是把cols对应的整个DataFrame的缺失值总数和行数比较,只有当所有选中列都全为空时才会用0填充,否则所有列都用均值填充,这和你的需求不符。
下面提供两种更优的实现方式:
方式一:逐列自定义处理(直观易读)
用apply对每一列单独应用填充逻辑,适合小数据集或需要清晰逻辑的场景:
def fill_missing(col): # 判断当前列是否全为空 if col.isna().sum() == len(col): return col.fillna(0.0) else: return col.fillna(col.mean()) # 对选中的列应用填充函数 train_x[cols] = train_x[cols].apply(fill_missing, axis=0)
方式二:向量化操作(高效快捷)
利用pandas的向量化特性,先计算各列均值,再把全空列的均值替换为0,最后统一填充,大数据集下效率更高:
# 计算各列均值(全空列的mean会返回NaN) col_fill_values = train_x[cols].mean() # 把全空列的填充值替换为0(notna().any()判断列是否存在非空值) col_fill_values = col_fill_values.where(train_x[cols].notna().any(), 0.0) # 批量填充空值 train_x[cols] = train_x[cols].fillna(col_fill_values)
这两种方式都能实现你的需求:每列单独判断,非全空列用自身均值填充空值,全空列用0填充。
内容的提问来源于stack exchange,提问作者hjsg1010
相关产品推荐
相关产品推荐

