Чтобы воспроизвести ваш пример, мне нужно было создать образец фрейма данных со случайными значениями (1000 для мужчин и женщин):
import numpy as np
import matplotlib.pyplot as plt
# create sample data
cols = ['Action', 'Adventure' , 'Animation' , 'Childrens' , 'Comedy' , 'Crime' , 'Documentary' , 'Drama' , 'Fantasy' , 'Film-Noir' , 'Horror' , 'Musical' , 'Mystery' , 'Romance' , 'Sci-Fi' , 'Thriller' , 'War' , 'Western', 'rating']
male_values = pd.DataFrame(columns = cols)
female_values = pd.DataFrame(columns = cols)
# define parameters for randomly recreated the dataframe
arr_dummy_genre = np.zeros(18, dtype = int)
arr_dummy_genre[0] = 1
range_rating = range(1,6)
# generate 1,000 random values
for i in range(1000):
random_rating = float(np.random.choice(range_rating))
random_genre = np.random.permutation(arr_dummy_genre)
random_row = np.append(random_genre, random_rating)
random_row
male_values.loc[len(male_values)] = random_row
random_rating = float(np.random.choice(range_rating))
random_genre = np.random.permutation(arr_dummy_genre)
random_row = np.append(random_genre, random_rating)
random_row
female_values.loc[len(female_values)] = random_row
На данный момент фреймы данных для женщин и мужчин содержат 1000 наблюдений для жанров и только рейтинги. Ваши данные имеют другую форму, но в данном примере это не проблема.
Следующие шаги подготовили данные, чтобы представить их так, как вы хотите, отключив фиктивную переменную, представляющую жанр, и сгруппировали по genre:
# reconstruct the dummified genre of the movie
female_values['genre'] = pd.Series(female_values[labels].columns[np.where(female_values[labels]!=0)[1]])
male_values['genre'] = pd.Series(male_values[labels].columns[np.where(male_values[labels]!=0)[1]])
# group by genre
gr_male_values = male_values.groupby('genre')['rating'].mean()
gr_female_values = female_values.groupby('genre')['rating'].mean()
Теперь, используя тот же фрагмент кода, просто изменив сгруппированные данные, вы можете построить график так, как хотите:
labels = ['Action', 'Adventure' , 'Animation' , 'Childrens' , 'Comedy' , 'Crime' , 'Documentary' , 'Drama' , 'Fantasy' , 'Film-Noir' , 'Horror' , 'Musical' , 'Mystery' , 'Romance' , 'Sci-Fi' , 'Thriller' , 'War' , 'Western']
x = np.arange(len(labels)) # the label locations
width = 0.35 # the width of the bars
fig, ax = plt.subplots(figsize=(15,7))
rects1 = ax.bar(x - width/2, gr_male_values, width, label='Male')
rects2 = ax.bar(x + width/2, gr_female_values, width, label='Female')
# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Most preferred movie genres', fontsize=14)
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()
fig.tight_layout()
plt.show()
Создание следующего сюжет, в моем случае совершенно случайный: