我从 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的文档中的类相同。
有什么建议吗?
答案 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)
答案 2 :(得分:0)
将变量的数据类型从对象转换为float / int。
答案 3 :(得分:-1)
我的代码中出现了另一个问题,产生了相同的错误:
'str' object has no attribute 'get'
对我来说,我的语法是...data='df'...
,其中df
是对象,但是不应该用引号引起来。一旦删除引号,我的程序就可以完美运行。我犯了其他人的错误,因为x =和y =参数用引号引起来(对于数据框中的列)