J'ai une trame de données Pandas que j'ai obtenue en utilisant l'analyse d'IMDb. Je veux pouvoir créer et sortir certains barplots, correspondant à la demande des utilisateurs de input ().
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
glo = []
from collections import Counter
for st in range(0, 10):
for i in oscar_df['Genre'][st]:
glo.append(i.strip())
os_df = pd.DataFrame(list(Counter(glo).items()), columns = ['G', 'Q'])
os_df.sort_values('G')
os_df
ax = sns.barplot(x='Q',y='G', data=os_df, palette="hls", orient='h');
ax.set(xlabel='Number of Oscars', ylabel = None)
Par exemple, l'entrée est '30', puis le graphique correspondant dans la plage (10, 19) (considérant que df commence à partir des années 20 et qu'il y a 10 films dans chaque décennie) apparaît pour l'utilisateur. Le code du graphique est ci-dessous (oscar_df est le df original, peut fournir le code d'analyse):
name decade genre 0 movie1 20s adventure 1 movie2 20s fantasy ... 89 movie35 00s drama 90 movie36 10s sci-fi
Je pensais à une fstring et une boucle, et je cherchais un beaucoup, mais je n'ai pas trouvé grand-chose. Y a-t-il moyen de résoudre ce problème?
3 Réponses :
J'ai trouvé la réponse moi-même, mais peut-être pas la plus sophistiquée.
dex = str(input('Enter two last digits of the decade (for instanse: 30): ')+'s')
for i in range(len(oscar_df['Decade'])):
if (set(oscar_df['Decade'][i]) == set(dex)) == True:
for a in oscar_df['Genre'][i]:
glo.append(a.strip())
os_df = pd.DataFrame(list(Counter(glo).items()), columns = ['G', 'Q'])
list.clear(glo)
os_df.sort_values('G')
ax = sns.barplot(x='Q',y='G', data=os_df, palette="hls", orient='h')
ax.set(xlabel='Amount of Academy Awards', ylabel = None);
plt.title('Stats for the decade you have chosen', fontname='Helvetica',
fontsize=18);
Je ne fais que publier quelques conseils utiles.
Je recommanderais de valider les réponses. Vous pouvez utiliser le module re (expressions régulières) et rechercher simplement deux chiffres dans la chaîne d'entrée. L'extrait de code suivant a également une boucle while qui se répétera jusqu'à ce qu'une réponse souhaitée soit entrée:
oscar_df.plot(x='genre', y='decade', kind='bar')
Vous pouvez utiliser .str.contains () pour filtrer un DataFrame. Ensuite, nous pouvons sauter les 's' sur la décennie:
df_counts.plot(kind='bar') # Very rudimentary.
Ou, gagnez du temps et obtenez simplement la colonne que vous voulez:
n = 10 df_top_n_count = df_decade[category].value_counts().sort_values(ascending=False)[:n]
Ne considérez aucune collection de boucle ou de contre-compteur, mais de filtrer simplement des lignes par entrée, puis exécutez un groupby code> compte:
Recherchez-vous une fonction de saisie utilisateur pour définir ce qu'il faut tracer?