尝试使用 Seaborn 从 DataFrame 列绘制单变量分布时,“ValueError:无法一起广播操作数”
Posted
技术标签:
【中文标题】尝试使用 Seaborn 从 DataFrame 列绘制单变量分布时,“ValueError:无法一起广播操作数”【英文标题】:`ValueError: operands could not be broadcast together` when attempting to plot a univariate distribution from a DataFrame column using Seaborn 【发布时间】:2016-03-03 07:25:07 【问题描述】:我正在尝试绘制 Pandas DataFrame
中列的单变量分布。代码如下:
ad = summary["Acquired Delay"]
sns.distplot(ad)
这会抛出:
ValueError: operands could not be broadcast together with shapes (9,) (10,) (9,)
我检查了这个系列是否有任何问题,将其传递为ad.values
,但发生了同样的错误。当我使用ad
的.plot
方法时问题就消失了:
ad = summary["Acquired Delay"]
ad.plot.hist()
问题消失了。情节不太透明,但相当不错。这是seaborn中的常见错误吗?发生这种情况是因为我的数据包含大量零吗?
【问题讨论】:
请包含完整的错误回溯,而不仅仅是最后一行。 另外,请粘贴运行print ad
或print summary
的输出。
不能包含印刷摘要或印刷广告,因为该系列太长了。问题是ad
有很多零。维护 seaborn 的优秀人员已经修复了无法包含完整错误回溯的问题! pip install seaborn --upgrade 不起作用,我们仍在 seaborn 0.7.0.dev0。但是这个问题已经在master 上得到解决,即 github 存储库。为@mwaskom 欢呼!!
【参考方案1】:
这是因为 seaborn 函数 distplot
包含行
if bins is None:
bins = min(_freedman_diaconis_bins(a), 50)
在不指定时设置分箱数,如果a
的长度不是平方且IQR为0,则_freedman_diaconis_bins
函数可以返回一个非整数。如果a
是由足够多的零控制,IQR 也将为零,例如
>>> sns.distributions.iqr([0]*8 + [1]*2)
0.0
所以我认为,您认为大量零可能起作用的直觉是正确的。无论如何,如果我们得到一个浮点数来表示 bin 的数量,那将打破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))
【讨论】:
仅供参考,这是在当前主服务器中修复的。 谢谢。它完美地工作。 @DSM - 谢谢你的回答,它真的帮助我理解了 seaborn 的工作原理。非常感谢您的努力。以上是关于尝试使用 Seaborn 从 DataFrame 列绘制单变量分布时,“ValueError:无法一起广播操作数”的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe 到 Seaborn 分组条形图
如何在 pandas DataFrame 中选择具有 MultiIndex 的列(用于 seaborn 散点图)?