我正在努力解决以下问题:
我有一个包含 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”?
您可以修改方法以在
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()
输出: