Python Pandas绘制分组均值柱状图异常:仅显示A类,如何显示B类?
问题描述
我有一个需要可视化的Excel表格,结构包含ORP列(含a、b等类别值)和Produkce_obyv._kg列(数值),使用Python Pandas处理。现有代码先筛选ORP为'A'和'B'的分组,分别计算均值并合并到DataFrame后绘制柱状图,但图表仅显示A类柱子,B类不显示。用于统计分析的ttest_ind检验可正常运行,排查发现数据无缺失、分组数据正常,仍无法解决问题,求原因及解决方法。
可视化代码
group1 = data[data['ORP']=='A'] group2 = data[data['ORP']=='B'] graf = group1.groupby('ORP')['Produkce_obyv._kg'].mean().to_frame(name='A') graf['B'] = group2.groupby('ORP')['Produkce_obyv._kg'].mean() graf.plot.bar() plt.show()
统计代码
ttest_ind_result = ttest_ind(group1['Produkce_obyv._kg'], group2['Produkce_obyv._kg'], equal_var=False) print(ttest_ind_result)
排查代码
print(graf.isna().sum()) print(len(group2)) print(group2['ORP'].unique())
原因分析
问题出在DataFrame的合并逻辑上:
group1.groupby('ORP')['Produkce_obyv._kg'].mean()生成的是索引为'A'的Seriesgroup2.groupby('ORP')['Produkce_obyv._kg'].mean()生成的是索引为'B'的Series- 当给
graf新增'B'列时,Pandas会按索引匹配值,但graf的索引只有'A',B的均值无法匹配到对应索引,最终导致'B'列没有有效数据(并非NaN,而是该值不在当前索引范围内),绘图时被自动忽略。
解决方法
方法1:一步式分组聚合(推荐)
无需拆分筛选再合并,直接按ORP分组筛选目标类别并计算均值,然后绘图:
# 筛选A、B类别并分组计算均值 graf = data[data['ORP'].isin(['A', 'B'])].groupby('ORP')['Produkce_obyv._kg'].mean() # 绘制柱状图 graf.plot.bar() plt.show()
方法2:提取标量值赋值
计算均值时直接提取数值(而非带索引的Series),再构建DataFrame:
group1 = data[data['ORP']=='A'] group2 = data[data['ORP']=='B'] # 直接取均值的标量值,避免索引干扰 graf = pd.DataFrame({'A': [group1['Produkce_obyv._kg'].mean()]}, index=['均值']) graf['B'] = group2['Produkce_obyv._kg'].mean() graf.plot.bar() plt.show()
方法3:重置索引后合并
将两个分组均值的Series重置索引,消除索引不匹配问题:
group1 = data[data['ORP']=='A'] group2 = data[data['ORP']=='B'] # 重置索引,去掉ORP作为索引 group1_mean = group1.groupby('ORP')['Produkce_obyv._kg'].mean().reset_index(drop=True) group2_mean = group2.groupby('ORP')['Produkce_obyv._kg'].mean().reset_index(drop=True) # 合并为DataFrame graf = pd.DataFrame({'A': group1_mean, 'B': group2_mean}) graf.plot.bar() plt.show()
内容的提问来源于stack exchange,提问作者Karel CZ
相关产品推荐
相关产品推荐

