首页 > 解决方案 > 将 SubDataFrame 变成 DataFrame?

问题描述

我有一个by创建 SubDataFrames 的。如何将这些转换为 DataFrame,最好不复制?

我最初的问题是我无法向 SubDataFrame 添加新列:

# df[:End] = 1:nrow(merged_islands)
# ERROR: LoadError: Cannot assign to non-existent column: End

# insert!(df, length(df), Array(1:nrow(merged_islands)), :End)
# ERROR: LoadError: MethodError: no method matching insert!(::SubDataFrame{Array{Int64,1}}, ::Int64, ::Array{Int64,1}, ::Symbol)

我猜将它转换为 DataFrame 是最简单的方法:)

标签: dataframejulia

解决方案


一个有趣的问题。在当前的主人(很快就会被标记)上,写DataFrame(sdf)where sdfis a就足够了SubDataFrame。它会创建所有向量的副本。

这是一个解决方案,它将创建一个DataFrame包含view所有向量的一个SubDataFrame(它应该在主版本和当前标记的版本上工作):

function sdf2df(sdf::SubDataFrame)
    p = parent(sdf)
    sel = DataFrames.rows(sdf)
    DataFrame(AbstractVector[view(p[i], sel) for i in 1:ncol(sdf)],
              names(sdf))
end

(我使用AbstractVector容器类型,因为它在当前主机上会更快)

DataFrame当它至少包含一列时,您将无法向其中添加行view

编辑:作为旁注(也许这最终是你的问题)。如果你有sdfwhich is aSubDataFrame其父级是dfwhichDataFrame如果你向其中添加列,df它们将立即可见,sdf因为SubDataFrame仅选择行并从父级继承所有列。


推荐阅读