朱莉娅DataFrame的转置

nya*_*4sn 1 dataframe julia

让我们创建Julia DataFrame

df=convert(DataFrame, rand(10, 4))
Run Code Online (Sandbox Code Playgroud)

看起来像这样。我正在尝试对此dataFrame进行转置。如下所示,“转置”功能似乎不适用于Julia Data Frame。

在此处输入图片说明

过去,我已经广泛使用Python Pandas数据框包。在Python中,它就像“ df.T”一样简单。请让我知道一种处理此数据帧的方法。

scl*_*cls 6

斯蒂芬回答的问题是没有保留列的顺序(如果您不相信以下内容,请尝试 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    ?
Run Code Online (Sandbox Code Playgroud)

但这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    ?
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我有相同的问题,并尝试了对您的问题的评论中建议的策略。但是,我遇到的问题是,Matrix如果您的DataFrame具有NA值,则无法转换为。您必须将它们更改为其他内容,然后转换为MatrixNA当我想Matrix回到原来的DataFrame类型时,遇到很多问题。

这里是一种用做DataFramestackunstack功能。

df = DataFrame(A = 1:4, B = 5:8)
df[:id] = 1:size(df, 1)

4×3 DataFrames.DataFrame
? Row ? A ? B ? id ?
????????????????????
? 1   ? 1 ? 5 ? 1  ?
? 2   ? 2 ? 6 ? 2  ?
? 3   ? 3 ? 7 ? 3  ?
? 4   ? 4 ? 8 ? 4  ?
Run Code Online (Sandbox Code Playgroud)

文档:id建议添加该列,DataFrame以帮助您进行堆叠。

现在,堆叠要转置的列:

dfl = stack(df, [:A, :B])

8×3 DataFrames.DataFrame
? Row ? variable ? value ? id ?
???????????????????????????????
? 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  ?
Run Code Online (Sandbox Code Playgroud)

然后取消堆栈,切换ID和变量名称(这就是为什么必须添加:id列的原因)。

dfnew = unstack(dfl, :variable, :id, :value)
2×5 DataFrames.DataFrame
? Row ? variable ? 1 ? 2 ? 3 ? 4 ?
??????????????????????????????????
? 1   ? A        ? 1 ? 2 ? 3 ? 4 ?
? 2   ? B        ? 5 ? 6 ? 7 ? 8 ?
Run Code Online (Sandbox Code Playgroud)