Select 包含 Julia 中最小分组变量的 DataFrame 行
Select rows of a DataFrame containing minimum of grouping variable in Julia
我想知道是否有一种有效的方法可以在 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 │
我想 return 一个包含相同列但仅 var3
根据 var1
.
在组中具有最小值的行
我曾尝试使用拆分-应用-组合方法,但似乎找不到在 return 处理所有列时过滤行的方法。
感谢任何帮助。
一种可行的方法:
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 │
如果每组 :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
。
我想知道是否有一种有效的方法可以在 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 │
我想 return 一个包含相同列但仅 var3
根据 var1
.
我曾尝试使用拆分-应用-组合方法,但似乎找不到在 return 处理所有列时过滤行的方法。
感谢任何帮助。
一种可行的方法:
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 │
如果每组 :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
。