如何使用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交互实现
核心思路是先将宽格式原始数据转为长格式,绑定下拉选择控件实现问题切换,无需重复编写透视代码,步骤如下:
- 数据预处理:自动识别所有问题列,转为长表结构
# 自动识别所有以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" )
- 交互组件与可视化实现
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
相关产品推荐
相关产品推荐

