我试图绘制熊猫DataFrame中列的单变量分布。代码如下:

ad = summary["Acquired Delay"]
sns.distplot(ad)

这抛出:
ValueError: operands could not be broadcast together with shapes (9,) (10,) (9,)

我已经检查了这个系列是否有任何错误,并将其作为ad.values传递,但同样的错误也会发生。当我使用.plot方法时,问题就消失了:
ad = summary["Acquired Delay"]
ad.plot.hist()

python - 尝试使用Seaborn从DataFrame列绘制单变量分布时,出现“ValueError:操作数无法一起广播”-LMLPHP
问题消失了。情节不那么透明,但还算不错。这是海本常见的虫子吗?发生这种情况是因为我的数据包含大量的零吗?

最佳答案

这是因为seaborn函数distplot包含行

   if bins is None:
        bins = min(_freedman_diaconis_bins(a), 50)

设置未指定时的箱数,如果_freedman_diaconis_bins的长度不是平方且IQR为0,a函数可以返回非整数。如果a被足够多的零控制,那么IQR也将为零,例如。
>>> sns.distributions.iqr([0]*8 + [1]*2)
0.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)

或者如果你真的想,你可以用类似的东西来修补
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))

08-26 21:09