Julia | DataFrame |替换缺少的值

Julia | DataFrame |替换缺少的值,dataframe,julia,Dataframe,Julia,对于DataFrame中的一列,我们如何用0.0替换缺失的值?用一些NA创建df using DataFrames df = DataFrame(A = 1.0:10.0, B = 2.0:2.0:20.0) df[ df[:B] %2 .== 0, :A ] = NA 您将在df中看到一些NA。。。我们现在将它们转换为0.0 df[ isna(df[:A]), :A] = 0 编辑=NaN→不适用。谢谢@Reza其他答案都很好。如果你是一个真正的速度迷,也许以下内容适合你: # prepa

对于
DataFrame
中的一列,我们如何用
0.0
替换
缺失的
值?

用一些
NA
创建
df

using DataFrames
df = DataFrame(A = 1.0:10.0, B = 2.0:2.0:20.0)
df[ df[:B] %2 .== 0, :A ] = NA
您将在
df
中看到一些
NA
。。。我们现在将它们转换为0.0

df[ isna(df[:A]), :A] = 0

编辑=
NaN
→<代码>不适用
。谢谢@Reza

其他答案都很好。如果你是一个真正的速度迷,也许以下内容适合你:

# prepare example
using DataFrames
df = DataFrame(A = 1.0:10.0, B = 2.0:2.0:20.0)
df[ df[:A] %2 .== 0, :B ] = NA


df[:B].data[df[:B].na] = 0.0 # put the 0.0 into NAs
df[:B] = df[:B].data         # with no NAs might as well use array

自从Julia最近引入了
missing
属性以来,这是一个更短、更新更多的答案

using DataFrames
df = DataFrame(A=rand(1:50, 5), B=rand(1:50, 5), C=vcat(rand(1:50,3), missing, rand(1:50))) ## Creating random 5 integers within the range of 1:50, while introducing a missing variable in one of the rows
df = DataFrame(replace!(convert(Matrix, df), missing=>0)) ## Converting to matrix first, since replacing values directly within type dataframe is not allowed

有几种不同的方法可以解决此问题(适用于Julia 1.x):

基地,替换! 可能最简单的方法是使用
replace或<代码>从基础位置替换
。下面是一个使用
replace

julia> using DataFrames

julia> df = DataFrame(x = [1, missing, 3])
3×1 DataFrame
│ Row │ x       │
│     │ Int64⍰  │
├─────┼─────────┤
│ 1   │ 1       │
│ 2   │ missing │
│ 3   │ 3       │

julia> replace!(df.x, missing => 0);

julia> df
3×1 DataFrame
│ Row │ x      │
│     │ Int64⍰ │
├─────┼────────┤
│ 1   │ 1      │
│ 2   │ 0      │
│ 3   │ 3      │
但是,请注意,此时列
x
的类型仍然允许缺少值:

julia> typeof(df.x)
Array{Union{Missing, Int64},1}
julia> df = DataFrame(x = [1, missing, 3]);

julia> df.x = replace(df.x, missing => 0);

julia> df
3×1 DataFrame
│ Row │ x     │
│     │ Int64 │
├─────┼───────┤
│ 1   │ 1     │
│ 2   │ 0     │
│ 3   │ 3     │
打印数据帧时,列
x
Int64
后面的问号也表示这一点。您可以使用
disallowmissing来更改此设置(:

或者,如果按如下方式使用
replace
(不带感叹号),则输出将不允许缺少值:

julia> typeof(df.x)
Array{Union{Missing, Int64},1}
julia> df = DataFrame(x = [1, missing, 3]);

julia> df.x = replace(df.x, missing => 0);

julia> df
3×1 DataFrame
│ Row │ x     │
│     │ Int64 │
├─────┼───────┤
│ 1   │ 1     │
│ 2   │ 0     │
│ 3   │ 3     │
Base.ismissing与逻辑索引 您可以将
ismissing
与逻辑索引一起使用,为数组中所有缺少的项分配一个新值:

julia> df = DataFrame(x = [1, missing, 3]);

julia> df.x[ismissing.(df.x)] .= 0;

julia> df
3×1 DataFrame
│ Row │ x      │
│     │ Int64⍰ │
├─────┼────────┤
│ 1   │ 1      │
│ 2   │ 0      │
│ 3   │ 3      │
基聚结 另一种方法是使用
合并

julia> df = DataFrame(x = [1, missing, 3]);

julia> df.x = coalesce.(df.x, 0);

julia> df
3×1 DataFrame
│ Row │ x     │
│     │ Int64 │
├─────┼───────┤
│ 1   │ 1     │
│ 2   │ 0     │
│ 3   │ 3     │
数据框架数据
replace
coalesce
都可以与包中的
@transform
宏一起使用:

附加文件

我不喜欢
df[:B]=convert(Array,df[:B],0.0)
?@RezaAfzalan我尝试过使用这种方法,但当我运行
convert(Array,df\u of_name,“none”)
时,它会给出一个错误,说
MethodError:no方法匹配convert(::Type{Array},::DataFrames.DataFrames,::String)
运行
convert(Array,df\u of_name)
工作正常。你知道为什么会出现这种错误吗?
julia> df = DataFrame(x = [1, missing, 3]);

julia> @transform(df, x = coalesce.(:x, 0))
3×1 DataFrame
│ Row │ x     │
│     │ Int64 │
├─────┼───────┤
│ 1   │ 1     │
│ 2   │ 0     │
│ 3   │ 3     │