如何让pandas堆叠柱状图显示无观测值的空bin区间
解决方法
你可以在统计完成后手动补全所有bin区间的索引,完全不需要修改groupby的observed=True设置,就能让缺失的bin显示为空柱,具体操作如下:
- 首先生成你业务需要的完整bin区间列表,如果你之前生成bin时的分割阈值还在,直接用阈值生成
IntervalIndex即可,示例如下(适配你当前的区间范围和0.05的步长):
import numpy as np import pandas as pd # 按你的区间范围生成分割边界,左闭右开所以终点多取0.05 bin_edges = np.arange(-0.5, 0.35, 0.05) full_bins = pd.IntervalIndex.from_breaks(bin_edges)
- 在原有的统计逻辑后新增
reindex操作,把缺失的bin补入,缺失值填0,修改后的完整代码如下:
# 原有统计逻辑,最后加reindex补全索引 stat_df = df.groupby(['bin'],observed=True)['Clicked']\ .value_counts(ascending=True,normalize=True)\ .unstack()\ .reindex(full_bins, fill_value=0) # 绘图逻辑不变 stat_df.plot(kind='bar' ,stacked=True,color=['C0','C3'],alpha=0.8) plt.legend(title="Clicked on:") plt.title("")
原理解释
reindex方法会按照你传入的完整bin列表调整索引,自动新增不存在的bin对应的行fill_value=0会把缺失bin的统计值设为0,绘图时就会显示为高度为0的空柱,且bin的顺序会和你预设的区间顺序保持一致- 全程保留
observed=True参数,不会触发你之前遇到的报错
内容的提问来源于stack exchange,提问作者amestrian
相关产品推荐
相关产品推荐

