代码之家  ›  专栏  ›  技术社区  ›  lanadaquenada

AttributeError:“float”对象在使用seaborn时没有属性“shape”

  •  1
  • lanadaquenada  · 技术社区  · 6 年前

    我创建了一个模拟数据集的随机数据帧 提示 从…起 seaborn公司 :

    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
    

    我的数据帧 df公司 对于每个列,具有与dataFrame相同的类类型 提示 来自seaborn的数据集:

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

    努比。浮动64

    str公司

    其他列也是如此。与我的数据帧相同:

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

    努比。浮动64

    str公司

    然而,当我尝试使用seaborn的 小提琴图 工厂批次 遵循 documentation :

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

    如果我使用数据框,我没有问题 提示 ,但当我使用数据帧时,我得到:

    AttributeError:“float”对象没有属性“shape”

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

    有什么建议吗?

    4 回复  |  直到 6 年前
        1
  •  5
  •   digdug    6 年前

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

    这里的问题是 df。总计\u账单 对象 而不是 浮动

    因此,解决方案是在将数据帧传递给seaborn之前将其更改为float:

    df.total_bill = df.total_bill.astype(float)
    
        2
  •  1
  •   ImportanceOfBeingErnest    6 年前

    这是一种非常不寻常的创建数据帧的方法。生成的数据帧还具有一些非常奇怪的属性,例如,它的长度为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)
    

    enter image description here

        3
  •  0
  •   AnksG    5 年前

    将变量的数据类型从object转换为float/int。

        4
  •  -1
  •   Hein Wessels    6 年前

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

    'str' object has no attribute 'get'
    

    对我来说,我有我的seaborn语法 ...data='df'... 哪里 df 是一个对象,但不应在引号中。一旦我删除了引号,我的程序就运行得很好。我犯了这个错误,就像其他人可能犯的那样,因为x=和y=参数在引号中(对于数据框中的列)