尝试使用 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 adprint 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 到 Seaborn 分组条形图

如何在 pandas DataFrame 中选择具有 MultiIndex 的列(用于 seaborn 散点图)?

Plotly 中的 Seaborn HUE

如何在不命名 DataFrame 列的情况下使用 Seaborn.lmplot 函数?

如何使用 seaborn 为我的 DataFrame 创建堆叠条形图 [重复]