[PYTHON] Comment formater un tableau à l'aide de Pandas Appliquer, pivoter et permuter le niveau

Aperçu

Créons une table comme celle-ci avec Pandas. スクリーンショット 2016-03-16 19.35.24.png

Des données d'entrée

import pandas as pd

tokyo = pd.DataFrame(data={'year':['2013','2014','2015'],
                           'cnt':[10,15,20],
                           'price':[100,100,90],},
                     columns=['year','cnt','price'])

osaka = pd.DataFrame(data={'year':['2013','2014','2015'],
                           'cnt':[5,6,7],
                           'price':[100,100,100],},
                     columns=['year','cnt','price'])

yokohama = pd.DataFrame(data={'year':['2015'],
                              'cnt':[1],
                              'price':[50],},
                        columns=['year','cnt','price'])

résultat


tokyo
-----------------------
   year  cnt  price
0  2013   10    100
1  2014   15    100
2  2015   20     90

osaka
-----------------------
   year  cnt  price
0  2013    5    100
1  2014    6    100
2  2015    7    100

yokohama
-----------------------
   year  cnt  price
0  2015    1     50

L'échantillon de données suppose les ventes d'un certain produit à Tokyo, Osaka et Yokohama pendant trois ans. cnt est la quantité et le prix est le prix unitaire. Yokohama a des données pour 2015 uniquement.

Concaténer les données d'entrée (concat)

Donnez à chaque DataFrame un nom de ville et joignez-les verticalement.

#Ajouter le nom de la ville à chaque DataFrame
tokyo['city'] = 'tokyo'
osaka['city'] = 'osaka'
yokohama['city'] = 'yokohama'

#Combinez verticalement
df = pd.concat([tokyo,osaka,yokohama], ignore_index=True)

résultat


df
-------------------------------------
   year  cnt  price      city
0  2013   10    100     tokyo
1  2014   15    100     tokyo
2  2015   20     90     tokyo
3  2013    5    100     osaka
4  2014    6    100     osaka
5  2015    7    100     osaka
6  2015    1     50  yokohama

Créer une nouvelle colonne en utilisant les informations d'une colonne existante (appliquer)

La méthode apply vous permet d'effectuer un traitement uniforme pour toutes les colonnes et lignes. Dans cet exemple, axis = 1 est spécifié, donc l'expression lambda est appelée ligne par ligne.

** Calculez les ventes en multipliant la quantité (cnt) et le prix unitaire (prix) **

#axis=En 1, appliquez la fonction à chaque ligne. axe axe='columns'Mais le même effet.
#x.cnt * x.La partie prix est le nombre*Prix unitaire
df["sales"] = df.apply(lambda x:x.cnt * x.price,axis=1)

résultat


df
------------------------------------------------
   year  cnt  price      city  sales
0  2013   10    100     tokyo   1000
1  2014   15    100     tokyo   1500
2  2015   20     90     tokyo   1800
3  2013    5    100     osaka    500
4  2014    6    100     osaka    600
5  2015    7    100     osaka    700
6  2015    1     50  yokohama     50

** Jugez la région de Kanto / Kansai à partir du nom de la ville **

#'west' if x.city == 'osaka' else 'east'Est une opération ternaire.
df["area"] = df.apply(lambda x:'west' if x.city == 'osaka' else 'east',axis=1)

résultat


df
------------------------------------------------
   year  cnt  price      city  sales  area
0  2013   10    100     tokyo   1000  east
1  2014   15    100     tokyo   1500  east
2  2015   20     90     tokyo   1800  east
3  2013    5    100     osaka    500  west
4  2014    6    100     osaka    600  west
5  2015    7    100     osaka    700  west
6  2015    1     50  yokohama     50  east

Créer un tableau des villes et des années (pivot_table)

Dressez la liste des ventes pour chaque année dans chaque ville. Pandas édite automatiquement avec pivot_table, mais les arguments sont compliqués et il faut un certain temps pour s'y habituer. .. Cette fois, j'ai fait référence à cette page.

#Faites un tableau du cnt et des ventes avec la superficie et la ville sur l'axe horizontal et l'année sur l'axe vertical.
#fill_value remplit la partie manquante des données avec 0.
df2 = pd.pivot_table(df,
                     index=['area','city'], 
                     columns=['year'],
                     values=['cnt','sales'],
                     fill_value=0) 

résultat


df2
------------------------------------------------
               cnt           sales            
year          2013 2014 2015  2013  2014  2015
area city                                     
east tokyo      10   15   20  1000  1500  1800
     yokohama    0    0    1     0     0    50
west osaka       5    6    7   500   600   700

Ce qui précède est le résultat de sortie de Python, mais si vous le rendez un peu plus facile à comprendre, cela ressemble à ceci.

              |  cnt           | sales             <Colonne 1ère couche(Sans nom)
              |================|===================
year          | 2013 2014 2015 | 2013  2014  2015  <Colonne 2ème couche(Le nom est l'année)
==============|================|===================
east|tokyo    |   10   15   20 | 1000  1500  1800
    |yokohama |    0    0    1 |    0     0    50
west|osaka    |    5    6    7 |  500   600   700
==============|================|===================
area|city <<L'indice comporte également deux niveaux. Les noms sont la région et la ville.

Modifier l'ordre des colonnes dans les résultats Pivot (niveau d'échange)

Je suis assez proche de la sortie, mais je veux que les colonnes soient dans l'ordre "année"> "quantité, ventes", donc [niveau d'échange](http://pandas.pydata.org/pandas-docs/stable/generated/pandas. Modifier avec DataFrame.swaplevel.html). (Si vous savez comment le faire avec pivot seul, faites-le moi savoir.)

** Swap 2 lignes dans la colonne **

#Le premier argument, 0, pointe vers la 0ème ligne de la colonne.
#Le deuxième argument, 1 pointe vers la première ligne de colum.
df2=df2.swaplevel(0,1, axis=1)

Résultat (l'année est passée au début)


df2
------------------------------------------------
year          2013 2014 2015  2013  2014  2015
               cnt  cnt  cnt sales sales sales
area city                                     
east tokyo      10   15   20  1000  1500  1800
     yokohama    0    0    1     0     0    50
west osaka       5    6    7   500   600   700

** Trier par année **

df3=df2[['2013','2014','2015']]

résultat


df3
------------------------------------------------
year          2013       2014       2015      
               cnt sales  cnt sales  cnt sales
area city                                     
east tokyo      10  1000   15  1500   20  1800
     yokohama    0     0    0     0    1    50
west osaka       5   500    6   600    7   700

Sortie vers Excel

Maintenant que vous avez créé la sortie souhaitée, exportez-la dans Excel.

#pip install openpyxl
writer = pd.ExcelWriter('output.xlsx')
df3.to_excel(writer,'Sheet1')
writer.save()

スクリーンショット 2016-03-16 20.52.52.png

Le reste se fait en dessinant des lignes et en coloriant. Il semble que cela puisse être fait avec openpyxl, mais cette fois je l'ai fait manuellement avec Excel.

Recommended Posts

Comment formater un tableau à l'aide de Pandas Appliquer, pivoter et permuter le niveau
[Python] Comment ajouter des lignes et des colonnes à une table (pandas DataFrame)
<Pandas> Comment gérer les données de séries chronologiques dans le tableau croisé dynamique
[Pandas] Comment vérifier les doublons dans un tableau et supprimer les doublons (équivalent à supprimer les doublons dans Excel)
[Python] Comment générer une table pandas dans un fichier Excel
Remarques sur la création d'un environnement LAMP à l'aide de Vagrant et VirtulBox
Comment coller un fichier CSV dans un fichier Excel à l'aide de Pandas
Comment diviser et enregistrer un DataFrame
Comment dessiner un graphique avec Matplotlib
Comment installer un package à l'aide d'un référentiel
Comment utiliser les pandas Timestamp et date_range
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
Comment obtenir un nom de colonne et un nom d'index spécifiques avec Pandas DataFrame
Comment copier et coller le contenu d'une feuille au format JSON avec une feuille de calcul Google (en utilisant Google Colab)
Comment coder un drone en utilisant la reconnaissance d'image
Comment mettre en ligne sur un Drive partagé à l'aide de pydrive
Comment désinstaller un module installé à l'aide de setup.py
La première étape de l'analyse du journal (comment formater et mettre les données du journal dans Pandas)
Comment lire les définitions de table générées dynamiquement à l'aide de SQL Alchemy
Comment écrire une interface graphique à l'aide de la commande maya
Comment utiliser Pandas 2
Comment configurer un environnement Python à l'aide de pyenv
Comment récupérer des données de courses de chevaux à l'aide de pandas read_html
[GCF + Python] Comment importer Excel vers GCS et créer une nouvelle table dans BigQuery
Comment organiser un séminaire pratique à l'aide de Jupyter à l'aide de Docker
Comment extraire des valeurs Null et des valeurs non Null avec des pandas
Comment afficher DataFrame sous forme de tableau dans Markdown
Comment créer un package Python à l'aide de VS Code
Comment enregistrer une table récupérée par python en csv
Comment exécuter une commande à l'aide d'un sous-processus en Python
[Python] Comment supprimer des lignes et des colonnes dans une table (liste des options de méthode de dépôt)
Comment gérer un README pour github et PyPI
Comment sortir un document au format pdf avec Sphinx
Comment transloquer un tableau à deux dimensions en utilisant uniquement python [Note]
Comment imprimer des caractères sous forme de tableau avec la fonction d'impression de Python
Comment ajouter de nouvelles données (lignes droites et tracés) à l'aide de matplotlib
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
Comment créer une trame de données et jouer avec des éléments avec des pandas
Comment appeler une fonction
Ajouts clés aux pandas 1.1.0 et 1.0.0
Comment utiliser Pandas Rolling
Comment pirater un terminal
[Python] Comment récupérer un fichier html local et le générer au format CSV à l'aide de Beautiful Soup
Comment définir un raccourci pour basculer entre pleine largeur et demi-largeur dans IBus
Présentation de la création d'un socket serveur et de la création d'un socket client
Comment comparer des listes et récupérer des éléments communs dans une liste
Traitez le résultat de l'exécution de Splunk en utilisant Python et enregistrez-le dans un fichier
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
[Python] Comment obtenir et modifier les lignes / colonnes / valeurs d'une table.
Création et déploiement d'applications Django (PTVS) à l'aide du stockage Azure Table
Comment installer des pandas sur EC2 (Comment gérer MemoryError et PermissionError)
Utilisez sqlalchemy pour rechercher la table DB et créer un Dataflame pour les pandas
JOI2019 / 2020 1ère qualification 3ème Comment résoudre les problèmes A et B
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Comment enregistrer une partie d'une longue vidéo en utilisant OpenCV
[ROS2] Comment décrire le remappage et les paramètres au lancement au format python
Comment mettre à jour une source de données de classeur packagée Tableau à l'aide de Python
Comment créer un fichier factice CSV contenant du japonais à l'aide de Faker
Comment POSTER sur un canal spécifié sans utiliser les WebHooks entrants de Slack