2
votes

Comment tracer les données groupées?

J'ai le dataframe suivant, c'est un sous-ensemble d'une rangée de 200 avec 18 types de voitures.

df_gg=df.groupby(['name','Syear']); df_gg.groups

J'ai besoin de votre aide pour visualiser les données.

Je veux un graphique à barres indiquant que les noms de voitures figurent sur l'axe horizontal et une barre indiquant le nombre de chaque année. (J'ajoute une image) Toute autre intrigue fonctionnera. J'ai juste besoin de voir la relation entre la voiture et le numéro de l'année.

Je ne pouvais aller nulle part à partir de ce code.

import pandas as pd

cars = {'Vnum': [1497, 1923, 1002, 1229, 1168, 1644, 2002, 1879, 1265, 1176, 1305, 1080],
       'name': ['Honda Civic','Toyota Corolla','Honda Civic', 'Toyota Corolla','Ford Focus','Audi A4','Honda Civic','Honda Civic','Toyota Corolla','Toyota Corolla','Toyota Corolla','Honda Civic'],
       'Enum': [23, 9, 2, 45, 13, 4, 25, 11, 6, 14, 27, 8],
       'Syear': [2019, 2000, 2003, 2000, 2000, 2019, 1977, 2000, 2003, 2003, 2000, 2000],
      
       }

df = pd.DataFrame(cars, columns = ['Vnum', 'name','Vnum','Syear'])

print (df)

entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

Vous pouvez transformer le DataFrame groupé en tableau croisé dynamique et le tracer.

df = df.groupby(['name', 'Syear']).count().reset_index()

pd.pivot_table(df, index = 'name', columns = 'Syear', values = 'Vnum').plot(kind = 'bar', rot = 0)
plt.show()

entrez la description de l'image ici


0 commentaires

1
votes

Essayez d'ajouter de la valeur ajoutée.

    import plotly.graph_objects as go
    
    df['name_year'] = df.name + ' ' + df.Syear.apply(str)
    
    traces = []
    for name_year in list(set(df.name_year)):
        trace = go.Bar(name=name_year, 
                x=df[df['name_year'] == name_year].name,
                y=df[df['name_year'] == name_year].Vnum,
                text=df[df['name_year'] == name_year].Syear,
                textposition='auto')
        traces.append(trace)
    
    fig = go.Figure(data=traces)
    fig.update_layout(barmode='group')
    fig.show()

entrez la description de l'image ici

MISE À JOUR: Code fixe


1 commentaires

@Vivek Kalyanarangan, @ mlang, @ Savostyanov Konstantin Merci à tous pour vos codes intéressants. Je pourrais tracer mes données avec toutes les méthodes, cependant, à cause des données de trente ans, la légende est devenue trop longue et l'intrigue n'a pas l'air très belle. Peut-être que le graphique à barres ne convient pas du tout à ce projet.



2
votes

Utilisation (alternative efficace) -

53.1 ms ± 4.65 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

entrez la description de l'image ici

Timings

@ La solution de Mlang -

300 ms ± 59.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Celui-là -

df.groupby(['name', 'Syear'])['Vnum'].count().unstack(level=-1).plot(kind = 'bar', rot = 0)


2 commentaires

Merci @Vivek Kalyanarangan pour avoir fourni une solution plus efficace!


Le principal avantage n'est-il pas qu'il ne modifie pas le df?