Наборная панель с использованием группы по в фрейме данных Python

#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, также работает и более чистый подход.