在 Julia 中选择包含最小分组变量的 DataFrame 的行

Kay*_*fey 4 group-by minimum julia split-apply-combine

我想知道是否有一种有效的方法可以在 Julia 中执行以下操作:

我有以下形式的数据帧:

julia> df1 = DataFrame(var1=["a","a","a","b","b","b","c","c","c"],
                var2=["p","q","r","p","p","r","q","p","p"],
                var3=[1,2,3,2,5,4,6,7,8])
9×3 DataFrame
? Row ? var1   ? var2   ? var3  ?
?     ? String ? String ? Int64 ?
?????????????????????????????????
? 1   ? a      ? p      ? 1     ?
? 2   ? a      ? q      ? 2     ?
? 3   ? a      ? r      ? 3     ?
? 4   ? b      ? p      ? 2     ?
? 5   ? b      ? p      ? 5     ?
? 6   ? b      ? r      ? 4     ?
? 7   ? c      ? q      ? 6     ?
? 8   ? c      ? p      ? 7     ?
? 9   ? c      ? p      ? 8     ?
Run Code Online (Sandbox Code Playgroud)

并且我想返回一个包含相同列的数据帧,但只返回var3根据var1.

我曾尝试使用拆分应用组合方法,但似乎无法找到一种在返回所有列的同时过滤行的方法。

感谢您对此的任何帮助。

Prz*_*fel 5

一种可能的方法:

julia> DataFrame([g[findmin(g.var3)[2],:] for g in groupby(df1, :var1)])
3×3 DataFrame
? Row ? var1   ? var2   ? var3  ?
?     ? String ? String ? Int64 ?
?????????????????????????????????
? 1   ? a      ? p      ? 1     ?
? 2   ? b      ? p      ? 2     ?
? 3   ? c      ? q      ? 6     ?

Run Code Online (Sandbox Code Playgroud)


Bog*_*ski 5

:var3如果每个组中没有重复项,另一种方法是:

\n
julia> combine(sdf -> sdf[argmin(sdf.var3), :], groupby(df1, :var1))\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 var1    var2    var3\n     \xe2\x94\x82 String  String  Int64\n\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\x80\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\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 a       p           1\n   2 \xe2\x94\x82 b       p           2\n   3 \xe2\x94\x82 c       q           6\n
Run Code Online (Sandbox Code Playgroud)\n

如果您可能有重复项,请使用:

\n
julia> combine(sdf -> filter(:var3 => ==(minimum(sdf.var3)), sdf), groupby(df1, :var1))\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 var1    var2    var3\n     \xe2\x94\x82 String  String  Int64\n\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\x80\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\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 a       p           1\n   2 \xe2\x94\x82 b       p           2\n   3 \xe2\x94\x82 c       q           6\n
Run Code Online (Sandbox Code Playgroud)\n

反而。

\n

正确处理重复项的另一个示例是:

\n
julia> combine(sdf -> first(groupby(sdf, :var3, sort=true)), groupby(df1, :var1))\n3\xc3\x973 DataFrame\n Row \xe2\x94\x82 var1    var2    var3\n     \xe2\x94\x82 String  String  Int64\n\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\x80\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\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 a       p           1\n   2 \xe2\x94\x82 b       p           2\n   3 \xe2\x94\x82 c       q           6\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,它的效率不是很高,但向您展示了如何在 DataFrames.jl 中使用groupby

\n