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

如何在含NaN时用pandas的cut函数和Interval绘制柱状图

问题:将NaN作为单独类别纳入基于vals1分箱的柱状图统计

我有一个包含两列浮点值(可能含NaN)的DataFrame,示例如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame({'vals1': [10,20,25,15,np.nan, 2], 'vals2': [5, 11, 12, np.nan, np.nan, np.nan]})

对应的DataFrame输出:

vals1  vals2
0   10.0    5.0
1   20.0   11.0
2   25.0   12.0
3   15.0    NaN
4    NaN    NaN
5    2.0    NaN

我希望利用vals1创建分箱(bins),然后绘制柱状图展示vals1和vals2的数值统计。核心需求是复用从vals1生成的bins,同时将NaN作为单独的类别/bins纳入统计并展示。

不含NaN时我可以实现该需求,代码如下:

# 从vals1生成3个分箱并排序
bins = sorted(pd.cut(df['vals1'], 3).value_counts(dropna=True).index)
print(bins)
# 输出结果:
# [Interval(1.977, 9.667, closed='right'),
#  Interval(9.667, 17.333, closed='right'),
#  Interval(17.333, 25.0, closed='right')]

# 用vals1的bins对vals2进行分箱
print(pd.cut(df['vals2'], bins=bins))
# 输出结果:
# 0     (1.977, 9.667]
# 1    (9.667, 17.333]
# 2    (9.667, 17.333]
# 3                NaN
# 4                NaN
# 5                NaN
# Name: vals2, dtype: category
# Categories (3, interval[float64, right]): [(1.977, 9.667] < (9.667, 17.333] < (17.333, 25.0]]

# 绘制非NaN值的柱状图
plt.figure()
plt.bar([str(b) for b in bins], pd.cut(df['vals1'], bins=bins).value_counts().sort_values(), label='vals1', alpha=0.4)
plt.bar([str(b) for b in bins], pd.cut(df['vals2'], bins=bins).value_counts().sort_values(), label='vals2', alpha=0.4)
plt.legend()
plt.show()

这段代码可以绘制非NaN值的柱状图,但有没有现成方法将NaN作为单独类别/bins添加进去?


内容的提问来源于stack exchange,提问作者Ytsen de Boer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:56:19