[PYTHON] J'ai essayé la fonction de tableau croisé dynamique des pandas

Fonctions inopinément nécessaires lors de la création de tableaux et de graphiques. J'ai essayé de résumer une telle fonction de tableau croisé dynamique qu'il y a une différence entre le ciel et la terre si vous ne la connaissez pas. Au fait, quand j'étais étudiant, je ne connaissais même pas la fonction de tableau croisé dynamique d'Excel, et je me souviens avoir pleuré et façonné les données expérimentales ... Depuis qu'il a été posté sur Qiita, je l'ai essayé avec la trame de données pandas cette fois.

Qu'est-ce qu'un tableau croisé dynamique?

L'une des fonctions d'Excel, il fait référence à un outil qui extrait les données nécessaires d'une liste préenregistrée, les agrège et les analyse dans toutes les directions. La fonction «agréger» est particulièrement pratique, et vous pouvez renvoyer le résultat affiché à droite à partir du format de données indiqué à gauche dans la figure ci-dessous.

image.png

Vous en aurez besoin lorsque vous voudrez faire des tableaux croisés ou lorsque vous souhaitez créer un graphique légèrement compliqué. Cette fois, je vais faire quelque chose de similaire sur la trame de données pandas au lieu d'Excel.

Données utilisées pour la pratique

Données de train empruntées à kaggle Titanic Competition. Veuillez consulter ici pour la signification de chaque colonne.

Sujet principal

Cela ressemble à ça tel qu'il est ... image.png Difficile à interpréter!

Préparation

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Path
input_path = "../input_data/"

# Set Display Max Columns
pd.set_option("display.max_columns", 50)

train = pd.read_csv(input_path + "train.csv", sep=",", header=0, quotechar="\"")
# test = pd.read_csv(input_path + "bank/test.csv", sep=",", header=0, quotechar="\"")

#Traitement de la valeur manquante car difficile à gérer
train["Embarked"] = train.Embarked.fillna("S") 
train["Age"]=train["Age"].fillna(train.Age.mean())

#Âge par âge
labels = [ "{0} - {1}".format(i, i + 9) for i in range(0, 100, 10) ]
train["Age"] = pd.cut(train["Age"], np.arange(0, 101, 10),
                      include_lowest=True, right=False,
                      labels=labels)

#Concentrez-vous sur ce qui semble être facile à gérer à cet effet
df = train[["PassengerId", "Survived", "Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]]

#Confirmation des données
df.head()

image.png

Les noms des passagers qui semblent difficiles à gérer sont supprimés.

Utilisez la fonction pivot_table

Au minimum, les trois arguments suivants sont requis

-Data (premier argument): Spécifiez l'objet pandas.DataFrame des données d'origine. -Index: spécifiez le nom de colonne des données d'origine. Il devient l'en-tête de la ligne de résultat. -Colonnes: spécifiez le nom de colonne des données d'origine. Il devient l'en-tête de colonne de résultat.

La valeur moyenne des colonnes non spécifiées dans l'index des arguments et les colonnes est calculée en conséquence, mais les colonnes dont le type n'est pas numérique sont exclues.

Utilisation de base

df.pivot_table(index="Age", columns= "Sex", values="Fare")

image.png Par défaut, la valeur moyenne de l'agrégation est renvoyée. (D'autres résultats peuvent être calculés en ajoutant aggfunc à l'argument.)

Spécifie comment calculer la valeur résultante: argument aggfunc

Par défaut, la valeur moyenne est calculée, mais il est possible de calculer la valeur par d'autres méthodes en spécifiant une fonction dans l'argument aggfunc. Par défaut (lorsque l'argument aggfunc est omis), numpy.mean () est spécifié.

df.pivot_table(index="Age", columns= "Sex", values="Fare", aggfunc='count')

image.png

En spécifiant aggfunc = 'count', le nombre de données applicables est compté.

Plusieurs lignes / colonnes peuvent être sélectionnées: index des arguments, colonnes

df.pivot_table(index="Age", columns= ["Pclass","Sex"], values="Survived", aggfunc='mean')

image.png

Plusieurs méthodes de calcul peuvent être spécifiées pour aggfunc

df.pivot_table(index="Age", columns= ["Pclass","Sex"], values="Survived",  aggfunc=["mean","count"])

image.png

Ajouter le résultat total: arguments marges, nom_marges

df.pivot_table(index="Age", columns= ["Pclass","Sex"], values="Survived", aggfunc=["mean","count"],margins=True, margins_name="total")

image.png

Si vous souhaitez standardiser le résultat, utilisez la fonction cross_tab: argument normaliser

En spécifiant l'argument normalisation de la fonction cross_tab, il peut être standardisé pour l'ensemble, pour chaque ligne et pour chaque colonne.

pd.crosstab(index=df.Age, columns= df.Sex, values=df.Fare, aggfunc='count',  normalize=True)

image.png

-Si normalize = True ou normalize = 'all', le total est normalisé à 1. -Si normalize = 'index' ou'columns ', il est normalisé pour que le total soit de 1 pour chaque ligne ou colonne.

c'est tout.

Après avoir utilisé le tableau croisé dynamique, les colonnes sont multicouches, mais je ne peux pas les extraire en spécifiant les colonnes. Si quelqu'un sait, veuillez commenter ...

Référence / citation

・ Http://yaginogogo.hatenablog.jp/entry/2016/04/22/011327 ・ Https://note.nkmk.me/python-pandas-pivot-table/ ・ Https://deepage.net/features/pandas-pivot.html ・ Https://boxil.jp/mag/a2149/ ・ Https://deepage.net/features/pandas-pivot.html ・ Https://qiita.com/kshigeru/items/bfa8c11d1e6487c791d3 ・ Https://qiita.com/hoto17296/items/3442af64c7acb682de6a

Recommended Posts

J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé un peu le comportement de la fonction zip
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
Dessinez sur Jupyter en utilisant la fonction de tracé des pandas
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai examiné l'argument class_weight de la fonction softmax_cross_entropy de Chainer.
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé d'exécuter l'exemple de code du module Ansible
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé la bibliothèque changefinder!
J'ai essayé le Sql Upsert de Pandas
Le pouvoir des pandas: Python
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai essayé de résumer le code souvent utilisé dans Pandas
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai affiché le chat de YouTube Live et essayé de jouer
J'ai essayé d'approcher la fonction sin en utilisant chainer (re-challenge)
J'ai essayé AdaNet pour les données de table
J'ai essayé le tutoriel TensorFlow 1er
J'ai essayé le roman Naro API 2
J'ai étudié le mécanisme de connexion flask!
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé le tutoriel TensorFlow 2ème
J'ai essayé l'API du roman Naruro
J'ai essayé de déplacer le ballon
J'ai essayé d'utiliser l'API checkio
J'ai essayé d'estimer la section.
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas