Это может сработать. Сначала я создал несколько случайных данных для тестирования.
Затем:
- groupby (['state', messages_status ']). Size ():
- groups за состояние и за состояние и рассчитывает, принимая размер
- ... .unstack ():
- для преобразования двух строк для каждого состояния в одну строку с отдельным столбцы для открытых и закрытых
- ... .fillna (0):
- , когда в каком-либо состоянии есть ноль открытых или закрытых жалоб, .size дал
Not a Number
, замените с нулями
- ... .plot (kind = 'bar', stacked = True)
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
states = ['Maryland','Georgia','Michigan','California','NewMexico','Indiana','Virginia','Illinois','Pennsylvania','Massachusetts','Oregon','Texas','NewHampshire','Minnesota','Tennessee','Colorado','Florida','Alabama','Washington','NewYork','NewJersey','Maine','Missouri','WestVirginia','Montana','Mississippi','Connecticut','Vermont','Kentucky','SouthCarolina','Ohio','Utah','Delaware','Arkansas','Nevada','Louisiana','Kansas','Arizona','North Carolina','Rhode Island','District of Columbia','Iowa']
status_options = ["open", "closed"]
num_states = len(states)
N = 300
# create a random list of states (with repitition)
complaints_states = np.random.choice(states, N)
# generate random status, with a little higher probability for "closed"
complaints_status = np.random.choice(status_options, N, p=[0.3, 0.7])
# create a dataframe
complaints_df = pd.DataFrame({'state': complaints_states, 'complaints_status': complaints_status})
# create the plot
complaints_df.groupby(['state', 'complaints_status']).size().unstack().fillna(0).plot(kind='bar', stacked=True)
plt.xlabel('') # remove unnecessary 'state' label
plt.ylabel('Number of Complaints')
plt.tight_layout()
plt.show()
![generated plot](https://i.stack.imgur.com/IYG02.png)