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_table
exemple 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: