我试图在Pandas DataFrame
中绘制列的单变量分布。这是代码:
ad = summary["Acquired Delay"]
sns.distplot(ad)
这引发:
ValueError: operands could not be broadcast together with shapes (9,) (10,) (9,)
我已经检查过这个系列是否有任何错误,将其作为ad.values
传递,但同样的错误也会发生。当我使用.plot
的{{1}}方法时,问题就消失了:
ad
问题消失了。情节不太透明,但相当不错。这是seaborn的常见病吗?这是因为我的数据包含大量零吗?
答案 0 :(得分:2)
这种情况正在发生,因为seaborn函数distplot
包含行
if bins is None:
bins = min(_freedman_diaconis_bins(a), 50)
设置未指定时的bin数,如果_freedman_diaconis_bins
的长度不是正方形且IQR为0,则a
函数可以返回非整数。 a
由足够的零支配,IQR也将为零,例如
>>> sns.distributions.iqr([0]*8 + [1]*2)
0.0
我认为你的直觉是大量的零可能扮演一个角色是正确的。无论如何,如果我们得到一个二进制数的浮点数,那将会中断np.histogram
:
>>> np.histogram([0,0,1], bins=2)
(array([2, 1], dtype=int32), array([ 0. , 0.5, 1. ]))
>>> np.histogram([0,0,1], bins=2.1)
Traceback (most recent call last):
File "<ipython-input-4-9aae3e6c77af>", line 1, in <module>
np.histogram([0,0,1], bins=2.1)
File "/home/dsm/sys/pys/3.5/lib/python3.5/site-packages/numpy/lib/function_base.py", line 249, in histogram
n += np.bincount(indices, weights=tmp_w, minlength=bins).astype(ntype)
ValueError: operands could not be broadcast together with shapes (2,) (3,) (2,)
所以我认为这是一个错误,你可以打开一张票。你可以通过直接传递数量来解决这个问题:
sns.displot(ad, bins=10)
或者如果你真的想要,你可以使用像
这样的东西进行monkeypatch修复sns.distributions._freedman_diaconis_bins_orig =
sns.distributions._freedman_diaconis_bins
sns.distributions._freedman_diaconis_bins = lambda x:
np.round(sns.distributions._freedman_diaconis_bins_orig(x))