首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择包含Julia中最小分组变量的DataFrame的行

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

Stack Overflow用户
提问于 2020-11-26 23:29:22
回答 2查看 374关注 0票数 4

我想知道在Julia中是否有一种有效的方法来完成以下操作:

我有一个以下形式的DataFrame:

代码语言:javascript
复制
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方法,但似乎找不到一种在返回所有列的同时过滤行的方法。

感谢大家在这方面的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-27 00:14:07

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

而不是。

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

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2020-11-27 00:02:06

一种可能的方法是:

代码语言:javascript
复制
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     │
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65024962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档