AttributeError: объект 'float' не имеет атрибута 'shape' при использовании seaborn - PullRequest
0 голосов
/ 26 апреля 2018

Я создал случайный фрейм данных, имитирующий набор данных tips из 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 имеет для каждого столбца тот же тип класса, что и у фрейма данных tips из набора данных Seaborn:

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

numpy.float64

1018 * ул *

И так далее для других столбцов. То же, что мой dataFrame:

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

numpy.float64

1027 * ул *

Тем не менее, когда я пытаюсь использовать скрипичный сюжет Seaborn или factorplot в соответствии с документацией :

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

У меня нет проблем, если я использую dataFrame tips , но когда я использую свой dataFrame, я получаю:

AttributeError: объект 'float' не имеет атрибута 'shape'

Я представляю, что это проблема с тем, как я передаю массив в dataFrame, но я не смог найти, в чем проблема, так как каждая проблема, которую я обнаружил в Интернете с тем же AttributeError, говорит, что это не тот тип класса, и, как показано выше, мой dataFrame имеет тот же тип класса, что и в документации Seaborn.

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 29 мая 2019

Преобразовать тип данных вашей переменной из объекта в float / int.

0 голосов
/ 20 июня 2018

Я получил ту же проблему и пытался найти решение, но не увидел ответа, который искал. Поэтому я думаю, что ответ здесь может помочь таким людям, как я.

Проблема здесь в том, что тип df.total_bill равен объект вместо float .

Таким образом, решение состоит в том, чтобы изменить его на float перед передачей кадра данных в seaborn:

df.total_bill = df.total_bill.astype(float)
0 голосов
/ 28 августа 2018

У меня была другая проблема в моем коде, которая вызвала ту же ошибку:

'str' object has no attribute 'get'

Для меня у меня был синтаксис seaborn ...data='df'..., где df, однако, является объектом и не должен быть в кавычках. Как только я удалил цитаты, моя программа работала отлично. Я сделал ошибку, как кто-то другой, потому что параметры x = и y = указаны в кавычках (для столбцов в кадре данных)

0 голосов
/ 27 апреля 2018

Это довольно необычный способ создания фрейма данных. Результирующий кадр данных также имеет некоторые очень странные свойства, например, он имеет длину 50, но последний индекс - 88. Я не буду отлаживать эти вложенные циклы. Вместо этого я бы предложил создать фрейм данных из некоторого массива, например как

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

...