Value_Counts, Mapping, GroupBy и Plotting
Я работаю над личным проектом с использованием данных IMDB и в настоящее время исчерпал все возможности.
Краткая информация:
- Я пытаюсь найти топ-10 кассовых режиссеров и актеров
- Я могу сделать это, но хотел бы сделать еще один шаг вперед и найти топ-10, только если они отвечают определенным критериям. EG: снялись в> 4 фильмах
Пока что я выполнил следующее:
plt.subplot2grid((2,3),(0,1))
actor_1 = df.pivot_table(index="Actor_1", values="Gross_Earnings", aggfunc='sum').sort_values(ascending=False)
actor_1[:15].sort_values(ascending=True).plot(kind='barh', width=0.7, alpha=0.5, color='red')
ax.tick_params(axis='x', labelsize=60)
ax.tick_params(axis='y', labelsize=60)
plt.xlabel("Gross Earnings")
plt.tight_layout()
plt.show()
Это работает, но возвращает только верхние значения; не верхние значения с дополнительными критериями> 4 фильма.
Я также попробовал следующее:
no_of_films = df.groupby("Actor_1")
name_count_key = df["Actor_1"].value_counts().to_dict()
no_of_films["Films"] = no_of_films["Actor_1"].map(name_count_key)
Но он возвращает следующую ошибку: "AttributeError: Не удается получить доступ к вызываемому атрибуту" map "объектов" SeriesGroupBy ", попробуйте использовать метод" apply ""
no_of_films = df.groupby("Actor_1")
name_count_key = df["Actor_1"].value_counts().to_dict()
no_of_films["Films"] = no_of_films["Actor_1"].apply(name_count_key)
Но он возвращает следующую ошибку: "TypeError: unhashable type: 'dict" "
Идея сгруппировать функции состояла в том, чтобы создать новый столбец с именем "Фильмы", поэтому посчитайте объем фильмов, в которых каждый актер сыграл главную роль, и затем используйте> 4, но он возвращает bools, а не фактическое значение.
Director Actor_1 IMDB_Score Gross_Earnings Movie_Title
Andrew Stanton Daryl Sabara 6.6 73058679 John Carter
Sam Raimi J.K. Simmons 6.2 336530303 Spider-Man 3
Nathan Greno Brad Garrett 7.8 200807262 Tangled
Joss Whedon Chris Hemsworth 7.5 458991599 Avengers: Age of Ultron
Это возможно или я глупый?
Любая помощь будет принята с благодарностью.
Спасибо,
Адриан
1 ответ
Я думаю, что вам нужен фильтр или boolean indexing
с transform
:
print (df)
Director Actor_1 IMDB_Score Gross_Earnings Movie_Title
0 James Cameron CCH Pounder 7.9 760505847 Avatar
1 James Cameron CCH Pounder 7.9 760505847 Avatar1
2 James Cameron CCH Pounder 7.9 760505847 Avatar2
3 James Cameron CCH Pounder 7.9 760505847 Avatar3
4 Gore Verbinski Johnny Depp 7.1 309404152 Pirates
5 Sam Mendes Christoph Waltz 6.8 200074175 Spectre
6 Gore Verbinski Johnny Depp 7.1 309404152 Pirates1
7 Sam Mendes Christoph Waltz 6.8 200074175 Spectre1
8 Christopher Nolan Tom Hardy 8.5 448130642 The
df1 = df.groupby(["Actor_1"]).filter(lambda x: len(x) > 3)
print (df1)
Director Actor_1 IMDB_Score Gross_Earnings Movie_Title
0 James Cameron CCH Pounder 7.9 760505847 Avatar
1 James Cameron CCH Pounder 7.9 760505847 Avatar1
2 James Cameron CCH Pounder 7.9 760505847 Avatar2
3 James Cameron CCH Pounder 7.9 760505847 Avatar3
Или более быстрое решение:
nofilms = df.groupby(["Actor_1"])['Movie_Title'].transform('size')
df1 = df[nofilms > 3]
print (df1)
Director Actor_1 IMDB_Score Gross_Earnings Movie_Title
0 James Cameron CCH Pounder 7.9 760505847 Avatar
1 James Cameron CCH Pounder 7.9 760505847 Avatar1
2 James Cameron CCH Pounder 7.9 760505847 Avatar2
3 James Cameron CCH Pounder 7.9 760505847 Avatar3
Тогда используйте groupby
и совокупность mean
:
df2 = df1.groupby('Actor_1')['Gross_Earnings'].mean()
print (df2)
Actor_1
CCH Pounder 760505847
Name: Gross_Earnings, dtype: int64
И последний сюжет Series.plot.barh
:
df2.plot.barh()