我试图绘制熊猫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()
问题消失了。情节不那么透明,但还算不错。这是海本常见的虫子吗?发生这种情况是因为我的数据包含大量的零吗?
最佳答案
这是因为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))