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
相关产品推荐
相关产品推荐

