尝试使用Seaborn从DataFrame列绘制单变量分布时,“ValueError:操作数无法一起广播”

时间:2015-11-29 16:58:52

标签: python numpy pandas matplotlib seaborn

我试图在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

Successful Plotting with matplotlib

问题消失了。情节不太透明,但相当不错。这是seaborn的常见病吗?这是因为我的数据包含大量零吗?

1 个答案:

答案 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))