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
相关产品推荐
相关产品推荐

