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 │