Почему при построении комбинированных данных Pandas в Seaborn выдается «Ошибка типа: -0.8 не строка»? - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над некоторыми примерами статистики, используя Scitkit-learn (0.20.0), и пытаюсь составить график некоторых вещей в процессе работы с Seaborn (0.9.0).Я продолжаю сталкиваться с ошибками, когда пытаюсь построить наборы данных, которые я комбинировал, используя функцию concat() Pandas.

Вот самый минимальный пример, который я мог бы построить:

import numpy
import pandas
import seaborn

X = numpy.array([[-1, -1, "A"]])
P = numpy.array([[-0.8, -1]])

data_x = pandas.DataFrame(X, columns=('x','y','group'))
data_p = pandas.DataFrame(P, columns=('x','y'))

data_p['group'] = "B"

combined = pandas.concat([data_x, data_p], ignore_index=True, sort=True)

seaborn.scatterplot(data=combined, x='x', y='y')

Это приводитв трассировке, заканчивающейся на:

TypeError: -0.8 is not a string

Если я удалю столбцы 'A' и 'group', ошибки не будет.Если я нанесу data_x или data_p отдельно, ошибки не будет.Но я использую Seaborn, чтобы построить результаты контролируемых классификационных упражнений, поэтому, напримерстолбцы для двумерных данных плюс столбцы категорий для группировки (например, group равно A или B дифференцировано по оттенку) и было ли что-то известно или предсказано (например, kind равно known или predicted дифференцированопо стилю) очень полезно.

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

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Когда вы создаете пустой массив со строкой, все другие значения в массиве также будут обрабатываться как объекты.

X = numpy.array([[-1, -1, "A"]])

print (X)

array([['-1', '-1', 'A']], dtype='<U11') 

P = numpy.array([[-0.8, -1]])

array([[-0.8, -1. ]])          ## Remains as float.

Итак, создание кадра данных сarray X приведет к кадру данных, где все столбцы являются объектами, где data_p останется с плавающей точкой.

data_x = pandas.DataFrame(X, columns=('x','y','group'))

print (data_x.dtypes)
x        object  
y        object               ## object dtypes
group    object
dtype: object

data_p = pandas.DataFrame(P, columns=('x','y'))
data_p['group'] = "B"

print (data_p.dtypes)

x        float64
y        float64            ## Here x and y remains as float.
group     object            
dtype: object

Теперь, когда вы concat оба кадра данных, Здесь x и y столбцыбудучи объектом в одном и плавающим в другом, по умолчанию будет объект dtype в combined.

combined = pandas.concat([data_x, data_p], ignore_index=True, sort=True)

print (combined.dtypes)

group    object
x        object
y        object
dtype: object

Таким образом, причина для TypeError заключается в том, что результирующие столбцы x & y являются объектами типа dtype.Точечный график требует числовые столбцы для построения.

combined = combined.apply(pd.to_numeric, errors='ignore')  ## Convert to numeric

group     object
x        float64
y        float64
dtype: object

seaborn.scatterplot(data=combined, x='x', y='y')

Plot

0 голосов
/ 22 октября 2018

Когда вы создаете свои данные таким образом, все элементы в массиве X рассматриваются как объекты.Вы можете увидеть это, когда печатаете data_x.info().

Чтобы избежать этого, вы можете быть уверены, что x и y в ваших основных DataFrames имеют числовой тип при генерации данных (я предполагаю, что здесь у вас просто естьпример).Это решение рекомендуется.

Если по какой-либо причине это невозможно, вы можете сделать это позже, например,

combined['x'] = combined['x'].astype('int') combined['y'] = combined['y'].astype('int')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...