【问题标题】:AttributeError: 'float' object has no attribute 'shape' when using seabornAttributeError: 'float' 对象在使用 seaborn 时没有属性 'shape'
【发布时间】:2019-05-29 17:59:20
【问题描述】:

我创建了一个随机数据帧来模拟来自 seaborn 的数据集tips

import numpy as np
import pandas as pd

time = ['day','night']
sex = ['female','male']
smoker = ['yes','no']
for t in range(0,len(time)):
    for s in range(0,len(sex)):
        for sm in range(0,len(smoker)):
            randomarray = np.random.rand(10)*10
            if t == 0 and s == 0 and sm == 0:
                df = pd.DataFrame(index=np.arange(0,len(randomarray)),columns=["total_bill","time","sex","smoker"])
                L = 0
                for i in range(0,len(randomarray)):
                    df.loc[i] = [randomarray[i], time[t], sex[s], smoker[sm]]
                    L = L + 1
            else:
                for i in range(0,len(randomarray)):
                    df.loc[i+L] = [randomarray[i], time[t], sex[s], smoker[sm]]
                    L = L + 1

我的 dataFrame df 的每一列都有与 seaborn 数据集中的 dataFrame tips 相同类型的类:

tips = sns.load_dataset("tips")
type(tips["total_bill"][0])
type(tips["time"][0])

numpy.float64

str

其他列以此类推。和我的dataFrame一样:

type(df["total_bill"][0])
type(tips["time"][0])

numpy.float64

str

但是,当我尝试在documentation 之后使用 seaborn 的 violinplotfactorplot 时:

g = sns.factorplot(x="sex", y="total_bill", hue="smoker", col="time",  data=df, kind="violin", split=True, size=4, aspect=.7);

如果我使用 dataFrame 提示,我没有问题,但是当我使用我的 dataFrame 时,我得到:

AttributeError: 'float' 对象没有属性 'shape'

我想这是我将数组传递到 dataFrame 的方式的问题,但我找不到问题所在,因为我在互联网上发现的每个问题都具有相同的 AttributeError 说这是因为它不是同一类型类,如上所示,我的 dataFrame 与 seaborn 文档中的类具有相同类型。

有什么建议吗?

【问题讨论】:

    标签: python seaborn attributeerror


    【解决方案1】:

    我遇到了同样的问题并试图找到解决方案,但没有看到我正在寻找的答案。所以我想在这里提供一个答案可能会对像我这样的人有所帮助。

    这里的问题是df.total_bill的类型是object而不是float

    所以解决方案是在将数据帧传递给 seaborn 之前将其更改为浮动:

    df.total_bill = df.total_bill.astype(float)
    

    【讨论】:

    • 是的,我在尝试在不同的数据帧上做小提琴图时遇到了同样的问题,当我明确定义我试图用作我的列的 dtype 时问题就消失了列作为浮点数。所以我觉得这个答案其实就是这个问题的答案。
    • 你也可以通过pd.to_numeric(...)stackoverflow.com/a/28648923/4521646使用转换
    【解决方案2】:

    这是创建数据框的一种相当不寻常的方式。生成的数据框也有一些非常奇怪的属性,例如它的长度为 50,但最后一个索引是 88。我不打算调试这些嵌套循环。相反,我建议从一些 numpy 数组创建数据框,例如喜欢

    import numpy as np
    import pandas as pd
    
    time = ['day','night']
    sex = ['female','male']
    smoker = ['yes','no']
    
    data = np.repeat(np.stack(np.meshgrid(time, sex, smoker), -1).reshape(-1,3), 10, axis=0)
    df = pd.DataFrame(data, columns=["time","sex","smoker"])
    df["total_bill"] = np.random.rand(len(df))*10
    

    然后绘图也可以正常工作:

    g = sns.factorplot(x="sex", y="total_bill", hue="smoker", col="time",  data=df, 
                       kind="violin", size=4, aspect=.7)
    

    【讨论】:

    • 我知道这是一种非常不寻常的创建数据帧的方式。也许我应该澄清我是这样创建我的,因为我需要有 4 个循环,并且在每个循环内我根据每个循环的参数进行一些计算。所以我需要将数据(我也不知道它将具有的形状)附加到最终的数据帧中。可能有更好的方法来做到这一点,但据我所知,这是我能做的最好的。问题还是一样的。当我传递的数据与示例中的数据类型相同时,为什么会出现此错误?
    • 因为你覆盖了一些数据而不是附加它。这是一个简单的检查:您希望在数据框中看到 2*3*10 = 80 行,但它只有 50 行。如果您在创建数据框时遇到问题,请询问该问题而不是绘制它。在任何情况下,即使您想使用嵌套循环,我仍然建议您首先创建一个列表,将行追加 行而不是索引现有数据框。创建该列表后,从中创建一个 DataFrame。
    • 谢谢,我询问了剧情,因为我没有意识到我的问题出在 DataFrame 上。我做了你在这里解释的事情,效果很好!
    • 我相信答案id是DataFrame的格式,整列不一定是对象,详情见pd.DataFrame().info()使用转换pd.to_numeric(...)stackoverflow.com/a/28648923/4521646
    【解决方案3】:

    将变量的数据类型从对象转换为浮点/整数。

    【讨论】:

      【解决方案4】:

      我的代码中有一个不同的问题产生了同样的错误:

      'str' object has no attribute 'get'
      

      对我来说,我在我的 seaborn 语法中使用了 ...data='df'...,其中 df 是一个对象,但是,不应该用引号引起来。一旦我删除了引号,我的程序就完美运行了。我犯了错误,就像其他人一样,因为 x= 和 y= 参数用引号引起来(对于数据框中的列)

      【讨论】:

        猜你喜欢
        • 2019-04-11
        • 2020-11-07
        • 2018-01-22
        • 2017-07-02
        • 2016-04-15
        • 2020-01-11
        • 1970-01-01
        • 2022-09-22
        • 2023-01-24
        相关资源
        最近更新 更多