Мой кадр данных pandas выглядит следующим образом:
title genre rating
Shutter Island [Horror, Action] 8
Spectre [Action, Thriller] 7
Я хотел бы сгруппировать по жанру и найти средний рейтинг. Проблема состоит в том, что столбец жанра содержит списки (переменной длины). Я просто хочу добавить фильм в группу, если жанр появится в списке жанров.
Я знаю, что, поскольку списки изменяемы, я могу сделать что-то вроде
movies['genre']=movies['genre'].apply(tuple)
movies.groupby(['genre']).mean()
Но, конечно, это не то, что я хочу, потому что я слишком много групп. Поскольку это может помочь, набор всех возможных жанров
{'Action',
'Adventure',
'Animation',
'Comedy',
'Crime',
'Documentary',
'Drama',
'Family',
'Fantasy',
'Foreign',
'History',
'Horror',
'Music',
'Mystery',
'Romance',
'Science Fiction',
'TV Movie',
'Thriller',
'War',
'Western'}
Вы должны сгладить списки, а затем можно заполнить mean
:
from itertools import chain
df = pd.DataFrame({
'genre' : list(chain.from_iterable(movies['genre'].values.tolist())),
'rating' : movies['rating'].values.repeat(movies['genre'].str.len())
})
print (df)
genre rating
0 Horror 8
1 Action 8
2 Action 7
3 Thriller 7
df = df.groupby('genre', as_index=False)['rating'].mean()
print (df)
genre rating
0 Action 7.5
1 Horror 8.0
2 Thriller 7.0