使用 DataFrame 组合返回 NamedTuple 失败

Returning a NamedTuple fails with DataFrame combine

有人能告诉我为什么使用 foo2,其中 returns 和 NamedTuplecombine 失败,但使用 foo,其中 returns一个Tuple,可以吗?

我收到的错误消息是关于 VectorTuple 是预期的,但是却给出了 NamedTuple。我不明白为什么返回 NamedTuple 失败。

function foo(vals)
    (sum(vals), mean(vals))
end

function foo2(vals)
    (tot = sum(vals), avg = mean(vals))
end

df = DataFrame(:a => [1,1,2,2,3,3], :b => [10,20,30,40,50,60])
gdf = groupby(df, :a)

res = combine(gdf, :b => foo)    # OK
res2 = combine(gdf, :b => foo2)  # Not OK

原因是在DataFrames.jl中NamedTuple被认为有多个列。如果你想把它放在一个列中,将结果包装在 Ref:

julia> res2 = combine(gdf, :b => Ref∘foo2)
3×2 DataFrame
 Row │ a      b_Ref_foo2
     │ Int64  NamedTupl…
─────┼────────────────────────────────
   1 │     1  (tot = 30, avg = 15.0)
   2 │     2  (tot = 70, avg = 35.0)
   3 │     3  (tot = 110, avg = 55.0)

如果您希望将结果扩展到多个列中,请将 AsTable 设置为目标:

julia> res2 = combine(gdf, :b => foo2 => AsTable)
3×3 DataFrame
 Row │ a      tot    avg
     │ Int64  Int64  Float64
─────┼───────────────────────
   1 │     1     30     15.0
   2 │     2     70     35.0
   3 │     3    110     55.0