2017-07-22 2 views
0

Je travaille sur un projet personnel utilisant IMDB Data et j'ai actuellement épuisé toutes les possibilités.Value_Counts, Mapping, GroupBy et traçage

Description rapide:

  • Je suis en train de trouver le top 10 des directeurs grosses recettes et les acteurs
  • Je peux le faire mais je voudrais prendre un peu plus loin et trouver que le top 10 si elles ont rencontré certains critères. EG: Vous avez déjà joué dans 4> Films

Jusqu'à présent, je l'ai exécuté les éléments suivants:

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() 

Cela fonctionne, mais il ne retourne que les premières valeurs; pas les meilleures valeurs avec les critères supplémentaires de> 4 films.

J'ai aussi essayé ce qui suit:

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) 

Mais il renvoie l'erreur suivante: « AttributeError: Impossible d'accéder à l'attribut appelable « carte » des objets « SeriesGroupBy », essayez d'utiliser la méthode 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) 

Mais il renvoie l'erreur suivante: « erreur de type: Type unhashable: « dict » »

l'idée groupe par la fonction était de créer une nouvelle colonne appelée « Films » donc comptez le volume des Films dans lesquels chaque acteur a joué, puis utilisez> 4, mais il renvoie les booléens et non la valeur réelle.

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 

Est-ce possible ou suis-je bête?

Toute aide serait grandement appréciée.

Merci,

Adrian

+0

Il semble que vous avez besoin 'df [ "Films"] = df [ "Acteur_1"] carte (de name_count_key)', peut vous donner. échantillon de données? – jezrael

+0

J'ai créé un nouveau bloc de données "no_of_films" donc je groupe des acteurs qui ont joué dans plusieurs films. La fonction de carte fonctionne sur la trame de données d'origine, mais lors de la récapitulation de la valeur compte, elle compte la somme (multipliée par le nombre d'apparences qui est incorrect) – AdrianC

+1

Withoud data is n'est pas une réponse facile. Petit conseil - [Ne pas publier d'images de code (ou de liens vers eux)] (http: //meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-ask-a-question). – jezrael

Répondre

1

Je pense que vous avez besoin filter ou boolean indexing avec 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 

ou une solution plus rapide:

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 

Ensuite, utilisez groupby et agrégats mean:

df2 = df1.groupby('Actor_1')['Gross_Earnings'].mean() 
print (df2) 
Actor_1 
CCH Pounder 760505847 
Name: Gross_Earnings, dtype: int64 

Et le dernier complot ourdi par Series.plot.barh:

df2.plot.barh() 
+0

Pas tout à fait - "Movie_Title" retournera toujours un comme ils sont tous uniques. J'ai besoin que le compte de l'acteur soit> 4, alors si cela est vrai, retournez le IMDB_Score moyen - espoir qui a du sens? – AdrianC

+0

Ne vous inquiétez pas, vous pouvez changer ''Movie_Title'' 'Director', la sortie est la même. Seul transfome a besoin d'une colonne de df. – jezrael

+0

Je modifie la réponse, s'il vous plaît vérifier. – jezrael