Скрипка Seaborn с использованием массивов - Ошибка: ни переменная `x`, ни` y` не является числовой - PullRequest
2 голосов
/ 27 октября 2019

Я пытаюсь создать несколько участков для скрипки в одном, используя морского рожка. Фрейм данных, который я использую, включает в себя несколько категориальных значений в одном столбце (для использования на оси x) с массивом значений для каждого категориального значения (для создания сюжета для скрипки для каждого категориального значения). Небольшой рабочий пример может быть таким:

foo = pd.DataFrame(columns =['Names','Values'])
for i in range(10):
    foo.loc[i] = ['no'+str(i),np.random.normal(i,2,10)]

Но при попытке

sns.violinplot(x='Names', y='Values', data=foo)

я получаю следующую ошибку

ValueError: Ни один из них xни переменная y представляется числовой.

Теперь я могу быть взломан и просто разделить массив на несколько строк следующим образом:

foo = pd.DataFrame(columns =['Names','Values'])
for i in range(3):
    bar = np.random.normal(i,2,10)
    for j,b in enumerate(bar):
        foo.loc[i*10+j] = ['no'+str(i),b]

, что дает нужный мне график:

enter image description here

Но я предполагаю, что есть более простое решение, без необходимости реструктурировать мой фрейм данных.

Ответы [ 2 ]

1 голос
/ 27 октября 2019

В пандах 0.25 вы можете использовать взорвать , для предыдущей версии использовать любое из решений здесь :

result = foo.explode('Values').reset_index(drop=True)
result = result.assign(Names=result['Names'].astype('category'), 
                       Values=result['Values'].astype(np.float32))

sns_plot = sns.violinplot(x='Names', y='Values', data=result)

Вывод violin plot of categorical data

Разнесение (или удаление) преобразует ваши данные в:

   Names     Values
0    no0   3.352148
1    no0   2.195788
2    no0   1.234673
3    no0   0.084360
4    no0   1.778226
..   ...        ...
95   no9  12.385434
96   no9   9.849669
97   no9  11.360196
98   no9   8.535900
99   no9   9.369197

[100 rows x 2 columns]

Назначение преобразует dtypes в:

Names     category
Values     float32
dtype: object
1 голос
/ 27 октября 2019

pd.DataFrame.explode() помогает вам превратить ваш столбец списков в отдельные ячейки. После преобразования их в действительные числа вместо строк sns.violinplot может строить без труда.

foo = foo.explode('Values')
foo['Values'] = foo['Values'].astype('float')
sns.violinplot(data=foo, x='Names', y='Values')

enter image description here

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