当涉及NaN时,如何使用剪切函数和区间用pandas绘制条形图?

问题描述 投票:0回答:1

我正在努力解决以下问题:

我有一个包含 2 列浮点值的数据框,其中可能包含 NaN。

例如:

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

In [6]: df
Out[6]: 
   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
创建“垃圾箱”,然后绘制一个条形图,其中包含
vals1
vals2
的值计数。

关键点是我想重用

vals1
创建的箱,以便可以绘制值计数并将NaN绘制为单独的类别/箱。

没有 NaN 我可以做到这一点:

In [7]: bins = sorted(pd.cut(df['vals1'], 3).value_counts(dropna=True).index)

In [8]: bins
Out[8]: 
[Interval(1.977, 9.667, closed='right'),
 Interval(9.667, 17.333, closed='right'),
 Interval(17.333, 25.0, closed='right')]

In [9]: pd.cut(df['vals2'], bins=bins)
Out[9]: 
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]]

In [10]: 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()

这可以很好地绘制非 NaN 值(见下文)。

问题:但是有没有办法以开箱即用的方式将 NaN 添加为“类别”或“bin”?

How to add the category NaN here?

python pandas matplotlib nan binning
1个回答
0
投票

您可以修改方法以在

dropna=False
 中使用 
value_counts
并使用结果系列索引而不是 bin 上的列表理解:

s1 = pd.cut(df['vals1'], bins=bins).value_counts(dropna=False).sort_values()
s2 = pd.cut(df['vals2'], bins=bins).value_counts(dropna=False).sort_values()

plt.figure()
plt.bar(s1.index.astype(str), s1, label='vals1', alpha=0.4)
plt.bar(s2.index.astype(str), s2, label='vals1', alpha=0.4)
plt.legend()

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.