使用 DataFrame 组合返回 NamedTuple 失败
Returning a NamedTuple fails with DataFrame combine
有人能告诉我为什么使用 foo2
,其中 returns 和 NamedTuple
与 combine
失败,但使用 foo
,其中 returns一个Tuple
,可以吗?
我收到的错误消息是关于 Vector
或 Tuple
是预期的,但是却给出了 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
有人能告诉我为什么使用 foo2
,其中 returns 和 NamedTuple
与 combine
失败,但使用 foo
,其中 returns一个Tuple
,可以吗?
我收到的错误消息是关于 Vector
或 Tuple
是预期的,但是却给出了 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