我不知道如何处理朱莉娅NA DataFrames。
例如,使用以下DataFrame:
> import DataFrames
> a = DataFrames.@data([1, 2, 3, 4, 5]);
> b = DataFrames.@data([3, 4, 5, 6, NA]);
> ndf = DataFrames.DataFrame(a=a, b=b)我可以在列:a上成功地执行以下操作
> ndf[ndf[:a] .== 4, :]但是,如果我在:b上尝试相同的操作,就会得到一个错误NAException("cannot index an array with a DataArray containing NA values")。
> ndf[ndf[:b] .== 4, :]
NAException("cannot index an array with a DataArray containing NA values")
while loading In[108], in expression starting on line 1
in to_index at /Users/abisen/.julia/v0.3/DataArrays/src/indexing.jl:85
in getindex at /Users/abisen/.julia/v0.3/DataArrays/src/indexing.jl:210
in getindex at /Users/abisen/.julia/v0.3/DataFrames/src/dataframe/dataframe.jl:268这是因为NA值的存在。
我的问题是,DataFrames与NA通常应该如何处理?我可以理解>或<对NA的操作将是undefined,但是==应该有效(不是吗?)
发布于 2015-07-09 23:54:42
你想在这里做什么?如果您想做这样的选择,您可以创建条件(不是NAN)和(等于4)。如果第一个测试失败了,那么第二个测试永远不会发生。
using DataFrames
a = @data([1, 2, 3, 4, 5]);
b = @data([3, 4, 5, 6, NA]);
ndf = DataFrame(a=a, b=b)
ndf[(!isna(ndf[:b]))&(ndf[:b].==4),:]在某些情况下,您可能只想删除某些列中带有NAs的所有行。
ndf = ndf[!isna(ndf[:b]),:]发布于 2016-10-05 07:54:05
关于我之前问过的this问题,如果您愿意,可以直接在模块源代码中更改这种NA行为。在文件indexing.jl中,有一个名为Base.to_index(A::DataArray)的函数,从第75行开始,您可以修改代码,将布尔数组中的NA设置为false。例如,您可以执行以下操作:
# Indexing with NA throws an error
function Base.to_index(A::DataArray)
A[A.na] = false
any(A.na) && throw(NAException("cannot index an array with a DataArray containing NA values"))
Base.to_index(A.data)
end 忽略isna()中的NA将导致源代码的可读性降低,在大公式中,性能损失如下:
@timeit ndf[(!isna(ndf[:b])) & (ndf[:b] .== 4),:] #3.68 µs per loop
@timeit ndf[ndf[:b] .== 4, :] #2.32 µs per loop
## 71x179 2D Array
@timeit dm[(!isna(dm)) & (dm .< 3)] = 1 #14.55 µs per loop
@timeit dm[dm .< 3] = 1 #754.79 ns per loop 发布于 2017-10-02 11:20:17
在许多情况下,您希望将NA视为单独的实例,即假设NA的所有内容都是“平等的”,而其他的一切都是不同的。
如果这是您想要的行为,那么当前的DataFrames API对您没有多大帮助,因为(NA == NA)和(NA == 1)都返回NA,而不是它们预期的布尔结果。
这使得非常繁琐的DataFrame过滤器使用循环:function filter(df,c) for r in eachrow(df) if (isna(c) && isna(r:[c])) || ( !isna(r[:c]) && r[:c] == c ) ...和中断DataFramesMeta.jl和Query.jl中的类似选择的功能,当存在或请求NA值时。
解决办法之一是使用isequal(a,b)代替a==b。
test = @where(df, isequal.(:a,"cc"), isequal.(:b,NA) ) #from DataFramesMeta.jlhttps://stackoverflow.com/questions/31329808
复制相似问题