2017-12-27 3 views
2

Ich habe ein Datenframe, das 2 Spalten hat: Genre und release_year. Jedes Jahr hat mehrere Genres. Das Format ist unten angegeben:Python: Liniendiagramm für Werte gruppiert nach mehreren Spalten

genre release_year 
Action 2015 
Action 2015 
Adventure 2015 
Action 2015 
Action 2015 

Ich brauche die Änderung in allen Genres im Laufe der Jahre mit Pandas/Python plotten.

df = pd.read('genres.csv') 

df.shape 
(53975, 2) 


df_new = df.groupby(['release_year', 'genre'])['genre'].count() 

Daraus ergibt sich die folgende Gruppierung.

release_year genre   
1960  Action    8 
      Adventure   5 
      Comedy    8 
      Crime    2 
      Drama    13 
      Family    3 
      Fantasy    2 
      Foreign    1 
      History    5 
      Horror    7 
      Music    1 
      Romance    6 
      Science Fiction  3 
      Thriller    6 
      War     2 
      Western    6 
1961  Action    7 
      Adventure   6 
      Animation   1 
      Comedy    10 
      Crime    2 
      Drama    16 
      Family    5 
      Fantasy    2 
      Foreign    1 
      History    3 
      Horror    3 
      Music    2 
      Mystery    1 
      Romance    7 
          ... 

Ich brauche Liniendiagramme für die Änderungen in Genre Eigenschaften über die Jahre. Ich muss eine Schleife haben, die mir hilft, für jedes Genre im Laufe der Jahre zu plotten. Beispiel:

df_action = df.query('genre == "Action"') 
result_plot = df_action.groupby(['release_year','genre'])['genre'].count() 
result_plot.plot(figsize=(10,10)); 

zeigt die Handlung für das Genre "Aktion". Ebenso, statt für jedes Genre getrennt zu plotten, muss ich eine Schleife für dasselbe haben.

Wie kann ich das tun? Kann mir bitte jemand dabei helfen?

Ich habe Folgendes versucht, aber es funktioniert nicht.

genres = ["Action", "Adventure", "Western", "Science Fiction", "Drama", 
    "Family", "Comedy", "Crime", "Romance", "War", "Mystery", 
    "Thriller", "Fantasy", "History", "Animation", "Horror", "Music", 
    "Documentary", "TV Movie", "Foreign"] 

for g in genres: 
    #df_new = df.query('genre == "g"') 
    result_plot = df.groupby(['release_year','genre'])['genre'].count() 
    result_plot.plot(figsize=(10,10)); 

Antwort

2

was Entstapeln Ihre Serie und Plotten alles in einem Befehl:

In [36]: s 
Out[36]: 
release_year genre 
1960.0  Action  8 
       Adventure  5 
       Comedy  8 
       Crime   2 
       Drama  13 
       Family  3 
       Fantasy  2 
       Foreign  1 
       History  5 
       Horror  7 
          .. 
1961.0  Crime   2 
       Drama  16 
       Family  5 
       Fantasy  2 
       Foreign  1 
       History  3 
       Horror  3 
       Music   2 
       Mystery  1 
       Romance  7 
Name: count, Length: 30, dtype: int64 

In [37]: s.unstack() 
Out[37]: 
genre   Action Adventure Animation Comedy Crime Drama Family Fantasy Foreign History Horror Music Mystery Romance \ 
release_year 
1960.0   8.0  5.0  NaN  8.0 2.0 13.0  3.0  2.0  1.0  5.0  7.0 1.0  NaN  6.0 
1961.0   7.0  6.0  1.0 10.0 2.0 16.0  5.0  2.0  1.0  3.0  3.0 2.0  1.0  7.0 

genre   Science Fiction Thriller War Western 
release_year 
1960.0     3.0  6.0 2.0  6.0 
1961.0     NaN  NaN NaN  NaN 

Plotten:

s.unstack().plot() 
2
df_new.unstack().T.plot(kind='bar') 

Ich habe mich für Balkendiagramm können Sie auf what ever ändern Sie brauchen

PS: Sie können crosstab betrachten, anstatt groupby

pd.crosstab(df.genre,df.release_year).plot(kind='bar') 

enter image description here

0

Ich empfehle seaborn Verwendung würde die Manipulation des Datenrahmen vermeiden helfen würde, vor dem Plotten. Sie können es installieren, indem Sie pip install seaborn ausführen. Es hat eine einfache API für Standard Arten von Parzellen:

RELEASE_YEAR vs Genre

import seaborn as sns 
sns.countplot(x='release_year', hue='genre', data=df) 

release_year vs genre

Genre vs RELEASE_YEAR

import seaborn as sns 
sns.countplot(x='genre', hue='release_year', data=df) 

genre vs release_year

Verwandte Themen