Créons une table comme celle-ci avec Pandas.
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.
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
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
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.
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
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()
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