Jon*_*ker 3 insert concatenation dataframe julia
有没有办法将行添加到特定索引处的现有数据帧?
例如,您有一个 3 行 1 列的数据框
df = DataFrame(x = [2,3,4])
X
2
3
4
Run Code Online (Sandbox Code Playgroud)
任何方式执行以下操作:
insert!(df, 1, [1])
Run Code Online (Sandbox Code Playgroud)
为了得到
X
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
我知道我可能可以连接两个数据帧 df = [df1; df2] 但我希望每当我想插入一行时避免对大 DF 进行垃圾处理。
在 DataFrames 0.21.4 中只需编写(我给出两个选项:一个是广播,时间很短,但会创建一个临时对象;另一个是foreach
编写时间较长,但分配的空间要少一些):
julia> df = DataFrame(x = [1,2,3], y = ["a", "b", "c"])\n3\xc3\x972 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x82 Int64 \xe2\x94\x82 String \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n\njulia> insert!.(eachcol(df), 2, [4, "d"]) # creates an temporary object but is terse\n2-element Array{Array{T,1} where T,1}:\n [1, 4, 2, 3]\n ["a", "d", "b", "c"]\n\njulia> df\n4\xc3\x972 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x82 Int64 \xe2\x94\x82 String \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 4 \xe2\x94\x82 d \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 4 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n\njulia> foreach((c, v) -> insert!(c, 2, v), eachcol(df), [4, "d"]) # does not create a temporary object\n\njulia> df\n5\xc3\x972 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x82 Int64 \xe2\x94\x82 String \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 4 \xe2\x94\x82 d \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 4 \xe2\x94\x82 d \xe2\x94\x82\n\xe2\x94\x82 4 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 5 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n请注意,上述操作不是原子的(如果要添加的元素的类型与列中允许的元素类型不匹配,它可能会损坏您的数据帧)。
\n如果您想要提供自动升级的安全操作,请使用以下命令:
\njulia> df = DataFrame(x = [1,2,3], y = ["a", "b", "c"])\n3\xc3\x972 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x82 Int64 \xe2\x94\x82 String \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n\njulia> [view(df, 1:1, :); DataFrame(names(df) .=> ['a', 'b']); view(df, 3:3, :)]\n3\xc3\x972 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x82 Any \xe2\x94\x82 Any \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 'a' \xe2\x94\x82 'b' \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n(虽然它有点慢并创建一个新的数据帧)
\n原来的答案在这里。它对于 1.0 版本之前的 Julia 有效(以及与之兼容的 DataFrames.jl 版本)。
\n我猜你想就地做。然后你可以使用insert!
这样的函数:
julia> df = DataFrame(x = [1,2,3], y = ["a", "b", "c"])\n3\xc3\x972 DataFrames.DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n\njulia> foreach((v,n) -> insert!(df[n], 2, v), [4, "d"], names(df))\n\njulia> df\n4\xc3\x972 DataFrames.DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 4 \xe2\x94\x82 d \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 4 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n当然,您必须确保添加的集合中具有正确的列数。
\n如果您接受使用 a 的未导出内部结构,DataFrame
您可以做得更简单:
julia> df = DataFrame(x = [1,2,3], y = ["a", "b", "c"])\n3\xc3\x972 DataFrames.DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n\njulia> insert!.(df.columns, 2, [4, "d"])\n2-element Array{Array{T,1} where T,1}:\n [1, 4, 2, 3]\n String["a", "d", "b", "c"]\n\njulia> df\n4\xc3\x972 DataFrames.DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 x \xe2\x94\x82 y \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1 \xe2\x94\x82 1 \xe2\x94\x82 a \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 4 \xe2\x94\x82 d \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82 2 \xe2\x94\x82 b \xe2\x94\x82\n\xe2\x94\x82 4 \xe2\x94\x82 3 \xe2\x94\x82 c \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n