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
.
我曾尝试使用拆分应用组合方法,但似乎无法找到一种在返回所有列的同时过滤行的方法。
感谢您对此的任何帮助。
一种可能的方法:
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)
:var3
如果每个组中没有重复项,另一种方法是:
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如果您可能有重复项,请使用:
\njulia> 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正确处理重复项的另一个示例是:
\njulia> 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
。