You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:07:22