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

Pandas水平条形图未显示Roof与Washroom分类问题排查

问题:水平条形图中两类数据计数未显示

代码能正常运行,但生成的水平条形图里,**Roof(屋顶)和Washroom or Bathroom (toilet,restroom/locker room)**这两个分类的计数完全没显示。

运行代码

import pandas as pd
import numpy as np
from matplotlib import rcParams

keep_origin = ['Cooking Area or Kitchen', 
              'Porch or Balcony', 
              'Sleeping Area or Bedroom (inc. patients room, dormitory, etc)',
              'Trash, Rubbish Storage (inc garbage chute room, garbage/industri',
              'Living Area (e.g. living, TV, recreation, etc)',
              'Garage',
              'Roof',
              'Laundry Area',
              'Washroom or Bathroom (toilet,restroom/locker room)',
              'Chimney/Flue Pipe',
              'Engine Area',
              'Trash, rubbish area (outside)',
              'Mechanical/Electrical Services Room',
              'Basement/cellar (not partitioned)',
              'Exterior Wall',
              'Other Outside Area',
              'Hallway, Corridor',
              'Electrical Systems',
              'HVAC Equipment Room (furnace room, water heater closet, boiler)',
              'Court, Patio, Terrace',
              'Attached Deck']

for i in df['Area_of_Origin']:
    if i not in keep_origin:
        df['Area_of_Origin'] = np.where((df.Area_of_Origin == i), 'Other', df.Area_of_Origin)
        
# 查看剩余分类计数
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(df['Area_of_Origin'].value_counts())
    
rcParams['figure.figsize'] = 20,13
df['Area_of_Origin'].value_counts(ascending=True).plot(kind='barh')

问题截图

水平条形图缺失分类截图


原因及解决方法

核心问题

要么是这两类在原始数据里计数为0,要么是替换非保留类为Other时,因为字符串不匹配(比如大小写、空格、截断差异),把这两类错误归到了Other里。另外你写的循环替换逻辑效率低,还容易漏处理或错处理。

具体修复步骤

1. 排查字符串匹配问题

先确认原始数据里这两类的真实取值,避免和keep_origin里的条目不一致:

# 搜索包含Roof、Washroom、Bathroom的所有唯一值
print(df[df['Area_of_Origin'].str.contains('Roof|Washroom|Bathroom', case=False, na=False)]['Area_of_Origin'].unique())

如果输出的字符串和keep_origin里的不一样,直接修正keep_origin里的对应条目,保证完全匹配。

2. 优化替换逻辑

把低效的循环替换改成批量处理,避免出错:

# 批量替换:在keep_origin里的保留,否则归为Other
df['Area_of_Origin'] = np.where(df['Area_of_Origin'].isin(keep_origin), df['Area_of_Origin'], 'Other')

或者用apply写法:

df['Area_of_Origin'] = df['Area_of_Origin'].apply(lambda x: x if x in keep_origin else 'Other')

3. 强制保留所有分类(哪怕计数为0)

如果确实有分类计数为0但必须显示,用reindex强制拉全所有分类,缺的补0:

# 获取计数并重新索引,确保keep_origin的所有分类都在,没有的补0
counts = df['Area_of_Origin'].value_counts().reindex(keep_origin + ['Other'], fill_value=0)
# 绘制水平条形图
counts.sort_values(ascending=True).plot(kind='barh', figsize=(20,13))

这样处理后,所有需要的分类都会出现在图表里,不会再出现缺失。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:25:27