【问题标题】:min/max on differences of DataFrame columns in JuliaJulia 中 DataFrame 列差异的最小/最大值
【发布时间】:2017-01-23 03:57:58
【问题描述】:

当我尝试检索 DataFrame 中列的最大差异时,出现错误。怎么了?

using DataFrames

a = [2,4,10,4,8,8]
b = [5,9,7,2,8,7]
c = [2,9,7,6,8,1]

df = DataFrame(A = a, B = b, C = c)
df[2,:A] = NA
df[3,:C] = NA

ab=df[:A] - df[:B]
bc=df[:B] - df[:C]
ac=df[:A] - df[:C]

df[:max] = max(ab, bc, ac)

println(df)

=> LoadError: MethodError: no method matching isless(::DataArrays.DataArray{Int64,1}, ::Array{Any,1})

df[:max] = max(ab, bc)df[:max] = max(a, b, c) 的最大值按预期工作。

任何人都可以澄清发生了什么吗?谢谢!

【问题讨论】:

    标签: dataframe julia


    【解决方案1】:

    注意返回类型:

    julia> typeof(ab)
    DataArrays.DataArray{Int64,1}
    
    julia> typeof(bc)
    DataArrays.DataArray{Int64,1}
    
    julia> typeof(ac)
    DataArrays.DataArray{Int64,1}
    
    julia> typeof(max(ab, bc))
    Array{Any,1}
    

    最后一个是问题所在。 Julia 抱怨它无法将DataArray{Int64,1}Array{Any,1} 进行比较。原始Int 数组不会发生这种情况,因为它们没有NA。如DataFrames docs 中所述,NA 毒害数组操作。

    观察下面的代码可以正常工作,因为它没有NA,所以max的返回类型是完全指定的:

    df2 = DataFrame(A = a, B = b, C = c)
    df2[:max] = max(a, b, c)
    typeof(df2[:max]) ### DataArrays.DataArray{Int64,1}
    

    您最好的选择是在计算最大值之前从您的DataFrame 中估算或清除NA。一种按行清除NA 的简单方法是

    df3 = DataFrames.na_omit(df)[1]
    

    【讨论】:

    • 据我所知。 na_omit 不是由 DataFrames 导出的。它在 v0.8.5 中仍然存在,但将来可能会改变
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2015-05-04
    • 2017-09-28
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多