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

如何用Matplotlib绘制包含NaN值列的箱线图

问题:使用Matplotlib绘制含NaN值的DataFrame箱线图(保留完整列数据)

给定如下DataFrame,每一列代表一个测量日:

9-1   9-2   9-3   9-4  9-5
0   23  16.0  18.0  18.0   26
1   27  18.0  20.0  17.0   33
2   10   9.0  15.0   8.0   30
3   23  30.0  19.0   5.0   15
4   10  10.0  23.0  29.0   12
5   50  13.0   8.0  20.0   23
6   12  24.0  31.0  27.0   35
7   10  29.0   NaN   7.0   22
8   34   NaN   NaN  16.0   31
9   28   NaN   NaN   NaN   24

需求:使用Matplotlib的boxplot()函数绘制所有列的箱线图,包括含NaN值的列,同时保留无NaN列(如9-1、9-5)的全部数据,不能截断数据匹配有NaN列的行数。当前绘制仅显示无NaN列,需要实现包含所有列的目标效果。

解决方案

核心思路是为每一列单独提取非NaN数据组成列表,再传入Matplotlib的boxplot()函数,这样每列都保留自身完整的有效数据,不会被其他列的NaN截断。

步骤1:准备数据

先将DataFrame的每一列处理为去除NaN后的数组,组成一个列表:

import pandas as pd
import matplotlib.pyplot as plt

# 构建示例DataFrame
data = {
    '9-1': [23,27,10,23,10,50,12,10,34,28],
    '9-2': [16.0,18.0,9.0,30.0,10.0,13.0,24.0,29.0,None,None],
    '9-3': [18.0,20.0,15.0,19.0,23.0,8.0,31.0,None,None,None],
    '9-4': [18.0,17.0,8.0,5.0,29.0,20.0,27.0,7.0,16.0,None],
    '9-5': [26,33,30,15,12,23,35,22,31,24]
}
df = pd.DataFrame(data)

# 提取每列非NaN数据组成列表
plot_data = [df[col].dropna().values for col in df.columns]

步骤2:使用Matplotlib绘制箱线图

将处理好的plot_data传入boxplot(),并设置x轴标签为列名:

plt.figure(figsize=(10,6))
plt.boxplot(plot_data)

# 设置x轴标签
plt.xticks(range(1, len(df.columns)+1), df.columns)

plt.title('每日测量数据箱线图')
plt.ylabel('测量值')
plt.xlabel('测量日')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

原理说明

Matplotlib的boxplot()函数支持接收由多个数组组成的列表,每个数组对应一个箱线图。通过对每列单独执行dropna()操作,我们确保了每列的有效数据都被完整保留,不会因为其他列存在NaN而丢失数据,同时所有列都会被绘制出来,包括含NaN的列。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 08:12:44