首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >朱莉娅DataFrames.jl -用NA (NAException)滤波数据

朱莉娅DataFrames.jl -用NA (NAException)滤波数据
EN

Stack Overflow用户
提问于 2015-07-09 23:07:25
回答 4查看 1.4K关注 0票数 6

我不知道如何处理朱莉娅NA DataFrames。

例如,使用以下DataFrame:

代码语言:javascript
复制
> 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上成功地执行以下操作

代码语言:javascript
复制
> ndf[ndf[:a] .== 4, :]

但是,如果我在:b上尝试相同的操作,就会得到一个错误NAException("cannot index an array with a DataArray containing NA values")

代码语言:javascript
复制
> 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,但是==应该有效(不是吗?)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-09 23:54:42

你想在这里做什么?如果您想做这样的选择,您可以创建条件(不是NAN)和(等于4)。如果第一个测试失败了,那么第二个测试永远不会发生。

代码语言:javascript
复制
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的所有行。

代码语言:javascript
复制
ndf = ndf[!isna(ndf[:b]),:]
票数 5
EN

Stack Overflow用户

发布于 2016-10-05 07:54:05

关于我之前问过的this问题,如果您愿意,可以直接在模块源代码中更改这种NA行为。在文件indexing.jl中,有一个名为Base.to_index(A::DataArray)的函数,从第75行开始,您可以修改代码,将布尔数组中的NA设置为false。例如,您可以执行以下操作:

代码语言:javascript
复制
# 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将导致源代码的可读性降低,在大公式中,性能损失如下:

代码语言:javascript
复制
@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 
票数 1
EN

Stack Overflow用户

发布于 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.jlQuery.jl中的类似选择的功能,当存在或请求NA值时。

解决办法之一是使用isequal(a,b)代替a==b

代码语言:javascript
复制
test = @where(df, isequal.(:a,"cc"), isequal.(:b,NA) ) #from DataFramesMeta.jl
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31329808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档