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()
Другие вопросы по тегам