AttributeError:' float'对象没有属性'形状'使用seaborn时

时间:2018-04-26 20:14:20

标签: python seaborn attributeerror

我从 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

我的dataFrame df 对于每一列,与seaborn数据集中的dataFrame 提示具有相同类型的类:

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的 violinplot factorplot 时:

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'对象没有属性'形状'

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

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

这是创建数据框的一种相当不寻常的方式。结果数据帧也有一些非常奇怪的属性,例如它的长度为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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

我的代码中出现了另一个问题,产生了相同的错误:

'str' object has no attribute 'get'

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