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

Matplotlib绘制柱状图仍残留NaN值问题求助

解决Matplotlib柱状图NaN值残留问题

问题核心

你遇到的NaN残留,本质是部分厂商无对应类型发动机数据,仅单纯删除NaN值并未同步过滤掉这些无数据的厂商条目,导致绘图时仍保留了它们的位置,出现空柱或异常显示。

针对性解决方案

1. 双重筛选有效数据

直接过滤出有对应类型有效排放数据的厂商,确保绘图数据集完全不含该类型数据缺失的厂商:

import pandas as pd
import matplotlib.pyplot as plt

# 假设原始数据存储在df中
# 筛选TF类型的有效数据(排除NaN)
tf_valid = df[(df['engine_type'] == 'TF') & df['lto_emission'].notna()]
# 筛选MTF类型的有效数据
mtf_valid = df[(df['engine_type'] == 'MTF') & df['lto_emission'].notna()]

# 分图绘制
fig, (ax_tf, ax_mtf) = plt.subplots(1, 2, figsize=(14, 6))

# TF发动机柱状图
ax_tf.bar(tf_valid['manufacturer'], tf_valid['lto_emission'], color='#2ecc71')
ax_tf.set_title('TF涡扇发动机LTO循环平均排放')
ax_tf.set_xlabel('制造商')
ax_tf.set_ylabel('平均排放值')
ax_tf.tick_params(axis='x', rotation=45)

# MTF发动机柱状图
ax_mtf.bar(mtf_valid['manufacturer'], mtf_valid['lto_emission'], color='#3498db')
ax_mtf.set_title('MTF混合涡扇发动机LTO循环平均排放')
ax_mtf.set_xlabel('制造商')
ax_mtf.set_ylabel('平均排放值')
ax_mtf.tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.show()

2. 分组聚合后过滤

若需按厂商+发动机类型分组计算均值,可先聚合再删除NaN条目:

# 分组计算平均排放,自动排除单组内的NaN
grouped_data = df.groupby(['manufacturer', 'engine_type'])['lto_emission'].mean().dropna()
# 重置索引转为二维表格
clean_df = grouped_data.reset_index()

# 拆分两类发动机数据
tf_group = clean_df[clean_df['engine_type'] == 'TF']
mtf_group = clean_df[clean_df['engine_type'] == 'MTF']

# 后续绘图逻辑同方案1

3. 绘图时跳过NaN位置

若必须保留所有厂商(即使某类型无数据),可手动过滤NaN对应的条目再绘图:

# 假设已获取所有厂商列表tf_manus和对应排放数据tf_emissions
valid_mask = ~pd.isna(tf_emissions)
ax_tf.bar(
    [tf_manus[i] for i in range(len(tf_manus)) if valid_mask[i]],
    tf_emissions[valid_mask]
)

关键提示

单纯调用dropna()只是删除了含NaN的行,但如果厂商列表是从原始全量数据提取的,就会出现“厂商存在但对应数据为空”的错位情况。核心要保证绘图用的厂商列表和排放数据一一对应,且均不含NaN相关条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:43:22