首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在DataFrames.jl中执行列转换失败

在DataFrames.jl中执行列转换失败
EN

Stack Overflow用户
提问于 2021-09-15 13:37:08
回答 1查看 55关注 0票数 5

假设我有以下数据帧:

代码语言:javascript
运行
复制
julia> using DataFrames

julia> df = DataFrame(id=["a", "b", "a", "b", "b"], v=[1, 1, 1, 1, 2])
5×2 DataFrame
 Row │ id      v
     │ String  Int64
─────┼───────────────
   1 │ a           1
   2 │ b           1
   3 │ a           1
   4 │ b           1
   5 │ b           2

我想计算由:id列定义的每个组在:v列中的唯一值的数量。我尝试了以下几种方法:

代码语言:javascript
运行
复制
julia> gdf = groupby(df, :id)
GroupedDataFrame with 2 groups based on key: id
First Group (2 rows): id = "a"
 Row │ id      v
     │ String  Int64
─────┼───────────────
   1 │ a           1
   2 │ a           1
⋮
Last Group (3 rows): id = "b"
 Row │ id      v
     │ String  Int64
─────┼───────────────
   1 │ b           1
   2 │ b           1
   3 │ b           2

julia> combine(gdf, :v => x -> length(unique(x)) => :len)
2×2 DataFrame
 Row │ id      v_function
     │ String  Pair…
─────┼────────────────────
   1 │ a       1=>:len
   2 │ b       2=>:len

但它并没有产生预期的结果。如何修复对combine的调用

EN

回答 1

Stack Overflow用户

发布于 2021-09-15 13:37:08

这是一个常见的问题。问题是Julia如何解释您的转换规范:

代码语言:javascript
运行
复制
julia> :v => x -> length(unique(x)) => :len
:v => var"#3#4"()

正如您所看到的,由于Julia运算符优先规则,整个x -> length(unique(x)) => :len部分被视为匿名函数的定义。相反,您应该将匿名函数的定义放在括号中,如下所示:

代码语言:javascript
运行
复制
julia> combine(gdf, :v => (x -> length(unique(x))) => :len)
2×2 DataFrame
 Row │ id      len
     │ String  Int64
─────┼───────────────
   1 │ a           1
   2 │ b           2

还要注意,在这种情况下,您可以像这样使用函数组合运算符

代码语言:javascript
运行
复制
julia> combine(gdf, :v => length∘unique => :len)
2×2 DataFrame
 Row │ id      len
     │ String  Int64
─────┼───────────────
   1 │ a           1
   2 │ b           2

在这种情况下,您不必显式定义匿名函数,因此不需要括号。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69194267

复制
相关文章

相似问题

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