#python #dataframe #matplotlib #pandas-groupby #bar-chart
Вопрос:
Я пытаюсь создать столбчатую гистограмму, которая повторяет изображение, я прочитал свои данные из csv и пытаюсь сгруппировать и отобразить столбчатую диаграмму, но не получаю желаемого результата.
Я сгруппировал данные по следующим образом:
modified_df1 = modified_df.groupby(["business_postal_code","risk_category"]).size().reset_index(name='counts')
modified_df1 = modified_df.loc[modified_df['counts'] > 1100]
После группирования и фильтрации данные выглядят следующим образом:
business_postal_code risk_category counts
20 94102.0 Low Risk 1334
22 94102.0 UnKnown 1106
24 94103.0 Low Risk 1472
25 94103.0 Moderate Risk 1474
26 94103.0 UnKnown 1329
44 94109.0 Low Risk 1415
48 94110.0 Low Risk 2189
49 94110.0 Moderate Risk 1731
50 94110.0 UnKnown 1331
117 94133.0 Low Risk 1412
Затем сделал панель стека:
df2 = modified_df1.groupby(['business_postal_code','risk_category'])['business_postal_code'].count().unstack('risk_category')
df2[['Moderate Risk','Low Risk']].plot(kind='bar', stacked=True)
Пожалуйста, подскажите, как добиться желаемого результата. Проблема в том, что я должен сгруппировать данные по 2 столбцам, а затем применить фильтр(если количество отсчетов > 1100) и распечатать строку стека.
Ответ №1:
IIUC, вы можете попробовать:
df.pivot(*df).plot(kind = 'bar', stacked = True)
или:
df.pivot_table(index = 'business_postal_code', columns = 'risk_category' , values = 'counts').plot(kind = 'bar', stacked = True)
выход:
Полный Пример:
df = pd.DataFrame({'business_postal_code': {20: 94102.0,
22: 94102.0,
24: 94103.0,
25: 94103.0,
26: 94103.0,
44: 94109.0,
48: 94110.0,
49: 94110.0,
50: 94110.0,
117: 94133.0},
'risk_category': {20: 'Low Risk',
22: 'UnKnown',
24: 'Low Risk',
25: 'Moderate Risk',
26: 'UnKnown',
44: 'Low Risk',
48: 'Low Risk',
49: 'Moderate Risk',
50: 'UnKnown',
117: 'Low Risk'},
'counts': {20: 1334,
22: 1106,
24: 1472,
25: 1474,
26: 1329,
44: 1415,
48: 2189,
49: 1731,
50: 1331,
117: 1412}})
df.pivot(*df).plot(kind = 'bar', stacked = True)
Ответ №2:
использование функции sum() вместо функции count() с функцией group by также даст ожидаемый результат.
df2 = modified_df1.groupby(['business_postal_code','risk_category'])['counts'].sum().unstack('risk_category')
df2[[«Умеренный риск»,»Низкий риск»,»Высокий риск», «БЕЗОПАСНЫЙ»]]. график(вид=»столбик», сложен=Верно, размер рисунка=(12,8))
Но подход, предложенный Nk03, также работает и более чистый подход.