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

如何在Altair中提取分组变量最终值并绘制柱状图?

问题解决:Altair中正确展示累积求和的最终值柱状图

你的问题出在重复数据的默认聚合上:base数据集里每个class对应3条带cumulative值的记录,用transform_window生成final字段后,每个class的每条记录都会被赋值为该类的最终累积值(比如A类的3条记录的final都是8)。而Altair的柱状图默认会对Y轴数值做sum聚合,所以83=24,123=36,导致结果错误。

下面提供两种有效解决方法:

方法1:直接聚合最终值

跳过重复的中间记录,用transform_aggregate直接计算每个class的最终累积值:

df = pd.DataFrame({"time":[1,2,3,1,2,3], "value": [1,5,2,2,3,7], "class": ["A","A","A","B","B","B"]})

# 先计算累积值,再聚合每个class的最后一个累积值
base = alt.Chart(df).transform_window(
    cumulative = "sum(value)",
    groupby = ["class"],
    frame = [None, 0],
).transform_aggregate(
    final_cumulative = "last(cumulative)",
    groupby = ["class"]
)

base.mark_bar().encode(
    x = "class:N",
    y = "final_cumulative:Q"
)

方法2:筛选最后一条记录

在生成final字段后,筛选出每个class中time最大的那条记录,避免重复聚合:

df = pd.DataFrame({"time":[1,2,3,1,2,3], "value": [1,5,2,2,3,7], "class": ["A","A","A","B","B","B"]})

base = alt.Chart(df).transform_window(
    cumulative = "sum(value)",
    groupby = ["class"],
    frame = [None, 0],
).transform_window(
    final = "last_value(cumulative)",
    groupby = ["class"],
    sort = [alt.SortField(field = "time")],
    frame = [None, None],
).transform_filter(
    # 筛选每个class的最后一条time记录
    alt.datum.time == alt.max(alt.datum.time, groupby=["class"])
)

base.mark_bar().encode(
    x = "class:N",
    y = "final:Q"
)

两种方法都能得到A类8、B类12的正确柱状图结果。

内容的提问来源于stack exchange,提问作者Bert Coerver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:07:07