我想知道在Julia中是否有一种有效的方法来完成以下操作:
我有一个以下形式的DataFrame:
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 │我想返回一个DataFrame,它包含相同的列,但根据var1,只返回var3在groups中具有最小值的行。
我尝试过使用split-apply-combine方法,但似乎找不到一种在返回所有列的同时过滤行的方法。
感谢大家在这方面的帮助。
发布于 2020-11-27 00:14:07
如果您在每个组的:var3中没有重复项,另一种方法是:
julia> combine(sdf -> sdf[argmin(sdf.var3), :], 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如果您可能有重复项,请使用:
julia> combine(sdf -> filter(:var3 => ==(minimum(sdf.var3)), sdf), 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而不是。
另一个正确处理重复项的示例是:
julia> combine(sdf -> first(groupby(sdf, :var3, sort=true)), 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在这种情况下,它的效率不是很高,但它向您展示了如何在DataFrames.jl中使用groupby。
发布于 2020-11-27 00:02:06
一种可能的方法是:
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 │https://stackoverflow.com/questions/65024962
复制相似问题