dataframe - 无法在 DataFrames.jl 中执行列转换

标签 dataframe julia

假设我有以下数据框:

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
我想计算列 :v 中唯一值的数量每个由列 :id 定义的组.我尝试了以下方法:
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 的调用?

最佳答案

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

julia> :v => x -> length(unique(x)) => :len
:v => var"#3#4"()
正如你可以看到整个 x -> length(unique(x)) => :len由于 Julia 运算符优先级规则,部分被视为匿名函数的定义。相反,您应该将匿名函数的定义括在括号中,如下所示:
julia> combine(gdf, :v => (x -> length(unique(x))) => :len)
2×2 DataFrame
 Row │ id      len
     │ String  Int64
─────┼───────────────
   1 │ a           1
   2 │ b           2
另请注意,在这种情况下,您可以使用函数组合运算符 像这样:
julia> combine(gdf, :v => length∘unique => :len)
2×2 DataFrame
 Row │ id      len
     │ String  Int64
─────┼───────────────
   1 │ a           1
   2 │ b           2
在这种情况下,您不必显式定义匿名函数,因此不需要括号。

关于dataframe - 无法在 DataFrames.jl 中执行列转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69194267/

相关文章:

r - 将 data.frame 乘以具有匹配条件的列

python - Pandas 列内容到新列,与其他原始列

python - 在DataFrame的开头(最左端)插入一列

matplotlib - 在 iJulia 中按顺序显示 PyPlot 图形和文本

julia - 我可以通过哪些方式对 Julia 函数进行基准测试?

julia - Julia 中的嵌套列表推导式

r - 基于 R 中另一个数据框中的多列删除数据框中的行

python - 替换列并扩展 DataFrame 中的索引

julia - 在 Julia 的一行中定义多个相同类型的变量?

julia - 如何访问数组的最后一个元素?