2017-02-16 3 views
0

У меня есть dataframe, где я хочу построить гистограммы каждого столбца.Pandas dataframe hist not plotting catgorical variables

df_play = pd.DataFrame({'a':['cat','dog','cat'],'b':['apple','orange','orange']}) 
df_play['a'] = df_play['a'].astype('category') 
df_play['b'] = df_play['b'].astype('category') 

df_play 
df_play.hist(layout = (12,10)) 

Однако им получать ValueError: num must be 1 <= num <= 0, not 1 Когда я попытался с целыми числами, а не категории в значениях, она работала хорошо, но я действительно хочу, чтобы имена уникальной строки, чтобы быть в оси х.

+0

Не то, что он меняет сообщение об ошибке, но ваша вторая и третья строки ничего не делать:. 'Df_play [ 'а'] astype ('категория')' не изменяет 'df_play [ 'а '] '(но возвращает' Series', который вы можете заменить своим оригинальным). – fuglede

+0

Спасибо за уловку – jxn

ответ

0

Поскольку нет естественного параметра для бининга, возможно, что вы хотите, а не гистограммы, являются штриховыми графиками value counts для каждого Series? Если да, то можно добиться того, что через

df_play['a'].value_counts().plot(kind='bar') 

Example bar plot

+0

Возможно ли иметь 'column a' и' b' как подзаголовки? – jxn

+0

Является ли намерение разделять категории? Если это так, 'df_play.apply (lambda x: x.value_counts()). Plot (kind = 'bar', subplots = True)' может делать то, что вы ищете. – fuglede

+0

@fugledge нет, они должны быть отдельными и не разделять категории – jxn

1

Вы можете просто применить pd.value_counts по столбцам и сюжет.

>>> df_play.apply(pd.value_counts).T.stack().plot(kind='bar') 

enter image description here

Если вы хотите надлежащего подзаговоры или что-то более сложное, я предлагаю вам просто итерацию с value_counts и создать сюжетных себя.

0

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

fig, axs = plt.subplots(1,len(df_play.columns),figsize(10,6)) 
for i,x in enumerate(df_play.columns): 
    df_play[x].value_counts().plot(kind='bar',ax=axs[i]) 

enter image description here