【问题标题】:Transpose of Julia DataFrameJulia DataFrame 的转置
【发布时间】:2016-10-06 16:53:19
【问题描述】:

让我们创建 Julia DataFrame

df=convert(DataFrame, rand(10, 4))

看起来像这样。我正在尝试转置此数据帧。 “转置”功能似乎不适用于 Julia 数据框,如下所示。

我过去曾广泛使用过 Python Pandas 数据框包。在 Python 中,它就像“df.T”一样简单请告诉我一种转置此数据帧的方法。

【问题讨论】:

  • 通常你想转置一个矩阵。这就像 Julia 中的 M' 一样简单。如果矩阵嵌入在 DataFrame 中,请将其转换为矩阵,转置,然后(如果必须)返回 DataFrame。在 OP 中,这将是 DataFrame(Matrix(df)')
  • 一个很好的建议,但是,这意味着原始数据框“df”中的行名和列名不再受到尊重。
  • 不确定 DataFrame 中是否有任何行名。看看 NamedArrays。它们支持转置并具有行、列、维度命名。
  • 注意' 是共轭转置,而常规转置是.'。在实践中,共轭转置更为常见,这就是选择这种语法的原因。

标签: dataframe julia


【解决方案1】:

我有同样的问题,并尝试了 cmets 中针对您的问题建议的策略。但是,我遇到的问题是,如果您的 DataFrame 具有 NA 值,则转换为 Matrix 将不起作用。您必须将它们更改为其他内容,然后转换为Matrix。当我想从 Matrix 转换回 DataFrame 类型时,我在转换回 NA 时遇到了很多问题。

这是一种使用DataFramestackunstack 函数的方法。

julia> using DataFrames

julia> df = DataFrame(A = 1:4, B = 5:8)
4×2 DataFrame
│ Row │ A     │ B     │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1   │ 1     │ 5     │
│ 2   │ 2     │ 6     │
│ 3   │ 3     │ 7     │
│ 4   │ 4     │ 8     │

julia> colnames = names(df)
2-element Array{Symbol,1}:
 :A
 :B

julia> df[!, :id] = 1:size(df, 1)
1:4

julia> df
4×3 DataFrame
│ Row │ A     │ B     │ id    │
│     │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1   │ 1     │ 5     │ 1     │
│ 2   │ 2     │ 6     │ 2     │
│ 3   │ 3     │ 7     │ 3     │
│ 4   │ 4     │ 8     │ 4     │

DataFrame 文档建议添加 :id 列,作为一种帮助取消堆叠的方法。

现在堆叠你想要转置的列:

julia> dfl = stack(df, colnames)
8×3 DataFrame
│ Row │ variable │ value │ id    │
│     │ Symbol   │ Int64 │ Int64 │
├─────┼──────────┼───────┼───────┤
│ 1   │ A        │ 1     │ 1     │
│ 2   │ A        │ 2     │ 2     │
│ 3   │ A        │ 3     │ 3     │
│ 4   │ A        │ 4     │ 4     │
│ 5   │ B        │ 5     │ 1     │
│ 6   │ B        │ 6     │ 2     │
│ 7   │ B        │ 7     │ 3     │
│ 8   │ B        │ 8     │ 4     │

然后unstack,切换id和变量名(这就是为什么添加:id列是必要的)。

julia> dfnew = unstack(dfl, :variable, :id, :value)
2×5 DataFrame
│ Row │ variable │ 1      │ 2      │ 3      │ 4      │
│     │ Symbol   │ Int64⍰ │ Int64⍰ │ Int64⍰ │ Int64⍰ │
├─────┼──────────┼────────┼────────┼────────┼────────┤
│ 1   │ A        │ 1      │ 2      │ 3      │ 4      │
│ 2   │ B        │ 5      │ 6      │ 7      │ 8      │

【讨论】:

    【解决方案2】:

    斯蒂芬回答的问题是没有保留列的顺序(如果您不相信以下DataFrame

    julia> df = DataFrame(A = 1:4, B = 5:8, AA = 15:18)
    4×3 DataFrame
    │ Row │ A     │ B     │ AA    │
    │     │ Int64 │ Int64 │ Int64 │
    ├─────┼───────┼───────┼───────┤
    │ 1   │ 1     │ 5     │ 15    │
    │ 2   │ 2     │ 6     │ 16    │
    │ 3   │ 3     │ 7     │ 17    │
    │ 4   │ 4     │ 8     │ 18    │
    

    但是这个DataFrame 可以使用以下方法转置(保持列/行的顺序):

    julia> DataFrame([[names(df)]; collect.(eachrow(df))], [:column; Symbol.(axes(df, 1))])
    3×5 DataFrame
    │ Row │ column │ 1     │ 2     │ 3     │ 4     │
    │     │ Symbol │ Int64 │ Int64 │ Int64 │ Int64 │
    ├─────┼────────┼───────┼───────┼───────┼───────┤
    │ 1   │ A      │ 1     │ 2     │ 3     │ 4     │
    │ 2   │ B      │ 5     │ 6     │ 7     │ 8     │
    │ 3   │ AA     │ 15    │ 16    │ 17    │ 18    │
    

    参考:https://github.com/JuliaData/DataFrames.jl/issues/2065#issuecomment-568937464

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多