Remodeler la base de données pandas avec pivot_table en Python – tutoriel et visualisation
Nous souhaitons souvent conserver les colonnes identifiantes telles quelles (index=["student", "school"]), mais pivotez ou «divisez» les valeurs d’une colonne (values="grade") basé sur une autre colonne (columns="class"). Comparez les trames de données originales et pivotées ci-dessous et vous comprendrez ce que cela signifie.
df_long.pivot_table(index=["student", "school"],
columns='class',
values='grade')
Chaque valeur unique dans la colonne de classe sera une nouvelle colonne (anglais, mathématiques, physique) dans la trame de données pivotée / large. Nous pouvons également fournir un liste à la columns paramètre.
Pour vous débarrasser du multi-index, utilisez reset_index().
Vous pouvez également agréger chaque ligne et colonne résultante en spécifiant margins=True (défaut False).
df_long.pivot_table(index=["student", "school"],
columns='class',
values='grade',
margins=True, # add margins
aggfunc='sum') # sum margins (rows/columns)
Ici, nous agrégons en calculant la somme via aggfunc='sum' (défaut 'mean').
Il existe de nombreuses autres fonctions d’agrégation que vous pouvez utiliser (par exemple,'median' 'sum' 'max'). Vous pouvez également spécifier plusieurs fonctions sous forme de liste (par exemple,aggfunc=['mean', 'sum']).
Si nous ne spécifions aucune colonne via columns, tout non-identifiant restant numérique les colonnes (uniquement la note dans ce cadre de données) seront pivotées (de long à large).
df_long.pivot_table(index=["student", "school"])
Dans les données longues originales, chaque élève a quatre (anglais, mathématiques, physique), mais dans le pivot_tableexemple ci-dessus, chaque élève n’a une grade après pivotement.
Pourquoi et comment ça marche? Si vous vous souvenez de l’exemple ci-dessus, la valeur par défaut est aggfunc='mean'. Ainsi, la fonction a consisté à regrouper les données par élève et par école (via index=["student", "school"]) et calculé la valeur moyenne pour chaque groupe.
Si vous utilisez le groupby associée à la trame de données pandas, vous obtiendrez le même résultat que ci-dessus.
df_long.groupby(['student', 'school']).mean().reset_index() student school grade
0 Andy Z 20
1 Bernie Y 200
2 Cindy Z 2000
3 Deb Y 20000
Si vous modifiez la fonction d’agrégation par défaut (par exemple, aggfunc='max'), vous obtiendrez des résultats différents. Les exemples ci-dessous vous montrent comment spécifier différentes fonctions d’agrégation et vous montrent également comment groupby peut être utilisé pour effectuer le même pivot.
Notez que vous verrez également la classe associée à chaque valeur « max » et « first ».
df_long.pivot_table(index=["student", "school"],
aggfunc=['max', 'first'])# groupby equivalent
# df_long.groupby(["student", "school"]).agg(['max', 'first']) max first
class grade class grade
student school
Andy Z physics 30 english 10
Bernie Y physics 300 english 100
Cindy Z physics 3000 english 1000
Deb Y physics 30000 english 10000
Le dernier exemple vous montre ce qui se passe lorsque vous faites pivoter plusieurs colonnes (columns=['school', 'class']) et vous pouvez également traiter les valeurs manquantes après pivotement en remplaçant le NaN valeurs avec une autre valeur (-5 dans l’exemple ci-dessous).
df_long.pivot_table(index="student",
columns=['school', 'class'],
values='grade',
fill_value=-5) # replace NaN with -5
le NaN des valeurs sont attendues car chaque élève appartient à une seule école (Y ou Z). Par exemple, Andy est à l’école Z et n’a donc pas de notes dans les colonnes Y.
J’espère que vous comprenez maintenant mieux comment pd.pivot_table remodèle les trames de données. J’attends vos réflexions et commentaires avec impatience.
Si vous trouvez cet article utile, suivez-moi et visitez mon site pour plus de tutoriels sur la science des données et aussi mes autres articles:

