如何解决朱莉娅多维阿雷
我在Julia
的数据框中存储了多维数组。
dfy = DataFrame(a = [[1,2,3],[4,5,6],[7,8,9]],b = ["M","F","F"])
3×2 DataFrame
│ Row │ a │ b │
│ │ Array… │ String │
├─────┼───────────┼────────┤
│ 1 │ [1,3] │ M │
│ 2 │ [4,6] │ F │
│ 3 │ [7,9] │ F │
我想获取第一列“ a”,并将第一个值存储在X1(1,4,7)中的每个元素中,将第二个值存储在X2(2,8)中的每一行中,并将第三个值存储在X1中X3(3,6,9)中的每一行。
我们如何用Julia
编程语言来实现这一目标?
解决方法
您可以尝试以下方法:
for i in 1:3
dfy[:,"X$i"] = getindex.(dfy.a,i)
end
一旦在这里运行就是结果:
julia> dfy
3×5 DataFrame
│ Row │ a │ b │ X1 │ X2 │ X3 │
│ │ Array… │ String │ Int64 │ Int64 │ Int64 │
├─────┼───────────┼────────┼───────┼───────┼───────┤
│ 1 │ [1,2,3] │ M │ 1 │ 2 │ 3 │
│ 2 │ [4,5,6] │ F │ 4 │ 5 │ 6 │
│ 3 │ [7,8,9] │ F │ 7 │ 8 │ 9 │
.
之后的点getindex
是向量化运算符,因此,您在{{1}的i
列的每一行中都是第a
个元素}。
我提供了几种选择,向您展示您可以做什么。
在给出选项之前,请允许我对替代答案进行评论,如果要更新现有数据框,通常这是获得所需内容的最自然的方法。 DataFrames.jl不仅支持按列名建立索引。 DataFrame.jl是一个二维对象,因此它需要像这样传递行索引和列索引:
julia> for i in 1:3
dfy[:,i)
end
julia> dfy
3×5 DataFrame
│ Row │ a │ b │ X1 │ X2 │ X3 │
│ │ Array… │ String │ Int64 │ Int64 │ Int64 │
├─────┼───────────┼────────┼───────┼───────┼───────┤
│ 1 │ [1,9] │ F │ 7 │ 8 │ 9 │
(请注意,这是错误消息提示您执行的操作-即setindex!
需要再传递一个参数)
现在有一些更高级的选项。第一个是:
julia> rename!(x -> "X"*x,DataFrame(Tuple.(dfy.a)))
3×3 DataFrame
│ Row │ X1 │ X2 │ X3 │
│ │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1 │ 1 │ 2 │ 3 │
│ 2 │ 4 │ 5 │ 6 │
│ 3 │ 7 │ 8 │ 9 │
因为我知道您想要一个新的数据框, 或创建一个将旧的新列组合在一起的新数据框,只需使用水平组合即可:
julia> [dfy rename!(x -> "X"*x,DataFrame(Tuple.(dfy.a)))]
3×5 DataFrame
│ Row │ a │ b │ X1 │ X2 │ X3 │
│ │ Array… │ String │ Int64 │ Int64 │ Int64 │
├─────┼───────────┼────────┼───────┼───────┼───────┤
│ 1 │ [1,9] │ F │ 7 │ 8 │ 9 │
最后,如果要更新现有数据框,可以编写:
julia> transform!(dfy,[:a => (x -> getindex.(x,i)) => "X$i" for i in 1:3]...)
3×5 DataFrame
│ Row │ a │ b │ X1 │ X2 │ X3 │
│ │ Array… │ String │ Int64 │ Int64 │ Int64 │
├─────┼───────────┼────────┼───────┼───────┼───────┤
│ 1 │ [1,9] │ F │ 7 │ 8 │ 9 │
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。