在Julia DataFrames中能否在聚合函数内结合combine与过滤?
在Julia DataFrames中结合分组、过滤与聚合实现条件求和
完全可以实现你要的需求,下面是两种贴近SQL逻辑的实现方式,都能得到按field1分组,分别统计field2为X、Y时field3求和的3行3列结果:
方法一:分组后直接在子数据框中过滤聚合
先构造示例数据(模拟你的数据结构):
using DataFrames df = DataFrame( field1 = repeat(["A", "B", "C"], inner=2), field2 = repeat(["X", "Y"], outer=3), field3 = [10, 20, 30, 40, 50, 60] )
核心实现代码:
# 按field1分组,对每个分组的子数据框直接过滤计算 result = combine(groupby(df, :field1)) do df_sub # 计算当前分组内field2为X时field3的和,init=0避免无匹配时返回missing sum_x = sum(df_sub[df_sub.field2 .== "X", :field3]; init=0) sum_y = sum(df_sub[df_sub.field2 .== "Y", :field3]; init=0) # 返回当前分组的统计结果 DataFrame(SumWhenX=sum_x, SumWhenY=sum_y) end
方法二:先构造条件列再聚合(更贴近SQL的CASE WHEN逻辑)
这种方式和你给出的SQL写法逻辑一致,先通过条件生成临时列,再分组求和:
# 添加条件列:当field2为X时取field3的值,否则为0 df[!, :temp_x] = ifelse.(df.field2 .== "X", df.field3, 0) df[!, :temp_y] = ifelse.(df.field2 .== "Y", df.field3, 0) # 按field1分组对临时列求和 result = combine(groupby(df, :field1), :temp_x => sum => :SumWhenX, :temp_y => sum => :SumWhenY )
两种方法最终都会得到如下结果:
3×3 DataFrame Row │ field1 SumWhenX SumWhenY │ String Int64 Int64 ─────┼──────────────────────────── 1 │ A 10 20 2 │ B 30 40 3 │ C 50 60
内容的提问来源于stack exchange,提问作者Eliezer Otero
相关产品推荐
相关产品推荐

