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

如何使用Altair在Pandas透视表中添加百分比并实现交互式统计

调研数据拆分透视+Altair交互式统计实现方案

按Gender维度拆分静态透视表实现

原有单维度透视逻辑只需新增columns参数指定拆分维度,配合空值填充即可得到预期结果,代码如下:

import pandas as pd

# 统计分性别的应答人数
q1_stat = pd.pivot_table(
    df,
    values="ID",
    index="Q1",
    columns="Gender",
    aggfunc="count",
    fill_value=0 # 无应答的组合自动填充0,匹配示例中N选项F列的0值
)

# 计算分性别占比:单选项某性别人数 / 该性别总应答人数*100
q1_pct = q1_stat.div(q1_stat.sum(axis=0), axis=1) * 100

# 合并计数与占比,生成多层表头的最终透视表
q1_final = pd.concat(
    [q1_stat.add_prefix("#Res_"), q1_pct.add_prefix("%Res_")],
    axis=1
)

运行后输出结构与给出的预期透视表完全一致。

全问题适配的Altair交互实现

核心思路是先将宽格式原始数据转为长格式,绑定下拉选择控件实现问题切换,无需重复编写透视代码,步骤如下:

  1. 数据预处理:自动识别所有问题列,转为长表结构
# 自动识别所有以Q开头的调研问题列,无需手动枚举
question_list = [col for col in df.columns if col.startswith("Q")]
# 宽表转长表:每行对应1位受访者1道题的应答结果
df_long = df.melt(
    id_vars=["ID", "Gender", "Age", "Dept"],
    value_vars=question_list,
    var_name="Question",
    value_name="Answer"
)
  1. 交互组件与可视化实现
import altair as alt

# 构建问题下拉选择器
q_select_bind = alt.binding_select(options=question_list, name="选择问题:")
q_selector = alt.selection_single(fields=["Question"], bind=q_select_bind, init={"Question": question_list[0]})

# 基础数据层:自动筛选选中问题,预计算分性别的人数、占比
base_chart = alt.Chart(df_long).transform_filter(
    q_selector
).transform_aggregate(
    resp_count="count(ID)",
    groupby=["Answer", "Gender"]
).transform_window(
    gender_total="sum(resp_count)",
    groupby=["Gender"]
).transform_calculate(
    resp_pct="datum.resp_count / datum.gender_total * 100"
)

# 分性别应答人数图
count_plot = base_chart.mark_bar().encode(
    x=alt.X("Gender:N", title=None),
    y=alt.Y("resp_count:Q", title="应答人数"),
    color="Gender:N",
    column=alt.Column("Answer:N", title="问题选项")
).properties(width=120, title="分性别应答人数")

# 分性别应答占比图
pct_plot = base_chart.mark_bar().encode(
    x=alt.X("Gender:N", title=None),
    y=alt.Y("resp_pct:Q", title="应答占比(%)", scale=alt.Scale(domain=[0,100])),
    color="Gender:N",
    column=alt.Column("Answer:N", title="问题选项"),
    tooltip=[
        alt.Tooltip("Gender:N", title="性别"),
        alt.Tooltip("resp_count:Q", title="应答人数"),
        alt.Tooltip("resp_pct:Q", title="占比(%)", format=".1f")
    ]
).properties(width=120, title="分性别应答占比")

# 拼接图表、绑定选择器
output_chart = (count_plot & pct_plot).add_selection(q_selector)
output_chart

使用说明

  • 后续新增调研问题只要保持Q+序号的列命名规则,会自动加入下拉选项,无需修改代码
  • 如需更换拆分维度(比如换成Dept、Age分段),只需修改groupby对应的字段即可
  • 鼠标悬浮在柱形上可查看具体数值,可读性优于静态透视表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:31:15