Python3 pandas分组统计各地点重要性分布及可视化实现方法
结构化统计结果整理方法
现有聚合结果的可优化点
你当前的聚合输出存在两个实际使用中的问题:
- 重复计算:对agent、count两个列分别计算了样本数,实际返回值完全一致,属于冗余信息
- 缺失值未补全:不存在的分组(比如London下没有Medium重要等级的样本)直接被省略,没有统一补0,后续计算和展示会出现断档
具体整理步骤
精简聚合逻辑,直接获取分组计数
不用对多列做size计算,直接用groupby的size方法拿到每组的样本数即可:# 生成分组计数长表 grouped = data.groupby(['location', 'importance']).size().reset_index(name='sample_count')转换为宽表结构,补全缺失分组
用pivot方法把嵌套在索引里的importance维度转成列,缺失值统一填充为0,同时手动调整列的顺序为High/Medium/Low,避免字母排序导致的列顺序混乱:structured_df = grouped.pivot( index='location', columns='importance', values='sample_count' ).fillna(0).astype(int) # 固定重要等级列的展示顺序 structured_df = structured_df[['High', 'Medium', 'Low']]更简洁的实现可以直接用
unstack一步完成长表转宽表,效果和pivot完全一致:structured_df = data.groupby(['location', 'importance']).size().unstack(fill_value=0)[['High', 'Medium', 'Low']]最终输出的结构化表效果如下:
location High Medium Low London 1 0 2 Melbourne 1 0 2 NYC 2 2 0
适配性可视化方案
针对这个三维交叉的统计结果,最直观的展示方式有两种:
- 堆叠柱状图(优先推荐):可以同时展示每个地点的总样本量、不同重要等级的内部构成
直接调用pandas内置绘图接口即可,无需额外复杂配置:import matplotlib.pyplot as plt # 配置绘图样式避免中文乱码 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 生成堆叠柱状图 structured_df.plot( kind='bar', stacked=True, figsize=(8, 5), title='各地点不同重要等级的样本分布' ) plt.ylabel('样本数量') plt.xlabel('地点') plt.xticks(rotation=0) plt.tight_layout() plt.show() - 分组柱状图:如果需要横向对比不同地点下同一重要等级的样本量,只需要把上述代码里的
stacked=True改为stacked=False即可。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

