将SubDataFrame变成DataFrame?

时间:2018-09-25 07:51:13

标签: dataframe julia

我有一个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是最简单的方法:)

1 个答案:

答案 0 :(得分:2)

一个有趣的问题。在当前的主服务器上(很快将被标记),只要写DataFrame(sdf)即可,其中sdfSubDataFrame。它将创建所有矢量的副本。

这是一个解决方案,它将使用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列的情况下,您将无法向其中添加行。

编辑:作为旁注(也许这最终是您的问题)。如果您有sdfSubDataFrame,其父是dfDataFrame,则如果您将列添加到df,它们将立即在{ {1}}和sdf一样,仅选择行并从父级继承所有列。