如何在含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
相关产品推荐
相关产品推荐

