You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia中如何用列均值填充DataFrame的缺失值?

Julia批量用列均值填充DataFrame缺失值的实现方法

首先给出示例数据:

using DataFrames
using Statistics
df = DataFrame(x = [1, missing, 3], y = [missing, 2, 3], z = [4, 4,  missing])

对应的DataFrame结构:

3×3 DataFrame
 Row │ x        y        z       
     │ Int64?   Int64?   Int64?  
─────┼───────────────────────────
   1 │       1  missing        4
   2 │ missing        2        4
   3 │       3        3  missing 

单列填充可以通过replace!结合mean和skipmissing实现:

replace!(df.x, missing => mean(skipmissing(df.x)))

执行后x列缺失值被填充为均值2,更新后的DataFrame:

3×3 DataFrame
 Row │ x       y        z       
     │ Int64?  Int64?   Int64?  
─────┼──────────────────────────
   1 │      1  missing        4
   2 │      2        2        4
   3 │      3        3  missing

直接使用eachcol批量调用replace!会触发MethodError,原因是eachcol(df)返回列集合,无法直接作为replace!的第一个参数,且mean(skipmissing(eachcol(df)))计算的是所有列均值组成的向量,并非每列单独的均值。

正确的批量实现方法

方法一:遍历列循环处理

遍历每一列,对单个列执行填充逻辑,逻辑与单列操作完全一致:

for col in eachcol(df)
    replace!(col, missing => mean(skipmissing(col)))
end

执行后所有列的缺失值都会被对应列的均值填充,最终DataFrame:

3×3 DataFrame
 Row │ x       y       z       
     │ Int64?  Int64?  Int64?  
─────┼─────────────────────────
   1 │      1      2      4
   2 │      2      2      4
   3 │      3      3      4

方法二:使用transform!批量处理

借助transform!函数结合匿名函数,一次性对所有列应用填充逻辑并修改原DataFrame:

transform!(df, eachcol() => (col -> replace(col, missing => mean(skipmissing(col)))) => identity)

其中eachcol()指定对所有列操作,匿名函数完成单列填充逻辑,=> identity表示保留原列名。

方法三:使用coalesce!简化操作

coalesce!可以直接将数组中的missing替换为指定非缺失值,代码更简洁:

for col in eachcol(df)
    col_mean = mean(skipmissing(col))
    coalesce!(col, col_mean)
end

内容的提问来源于stack exchange,提问作者Quinten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:15:34