Сложенная гистограмма сгруппированных значений в Pandas

я пытаюсь создать гистограмму с накоплением сгруппированных значений, используя этот код:

titanic.groupby('Survived').Age.hist(stacked=True)

Но я получаю эту гистограмму без сложенных столбцов.

введите описание изображения здесь

Как я могу сложить гистограмму без необходимости напрямую использовать matplotlib или перебирать группы?

Используемый набор данных: https://www.udacity.com/api/nodes/5454512672/supplemental_media/titanic-datacsv/download


person leokury    schedule 12.01.2017    source источник


Ответы (4)


Улучшите ответ, лучший способ может быть:

titanic.pivot(columns='Survived').Age.plot(kind = 'hist', stacked=True)

введите описание изображения здесь

person Qianbo Wang    schedule 29.12.2018

Лучший способ, который я нашел до сих пор, — это создать новый фрейм данных с группами:

pd.DataFrame({'Non-Survivors': titanic.groupby('Survived').get_group(0).Age,
              'Survivors':   titanic.groupby('Survived').get_group(1).Age})
            .plot.hist(stacked=True)

введите описание изображения здесь

person leokury    schedule 20.02.2017
comment
При группировке по столбцам с большим количеством значений это, вероятно, проще: pd.DataFrame({k: v for k, v in titanic.groupby('Survived').Age}).plot.hist(stacked=True) - person nnnmmm; 27.03.2018
comment
Лучшее решение для меня здесь, в частности, поскольку df.pivot - очень специфическая операция, которая работает только для категориальных серий. - person Joël; 12.07.2019

В этом решении вместо гистограммы используется гистограмма, но я думаю, что это дает вам то, что вы ищете.

titanic.groupby(['Survived', pd.cut(titanic['Age'], np.arange(0,100,10))])\
       .size()\
       .unstack(0)\
       .plot.bar(stacked=True)

введите здесь описание изображения

person Ted Petrou    schedule 12.01.2017

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

def hist(x):
    h, e = np.histogram(x.dropna(), range=(0, 80))
    e = e.astype(int)
    return pd.Series(h, zip(e[:-1], e[1:]))

kw = dict(stacked=True, width=1, rot=45)
titanic.groupby('Survived').Age.apply(hist).unstack(0).plot.bar(**kw)

введите здесь описание изображения

person piRSquared    schedule 13.01.2017