Lassen Sie uns mit Pandas eine solche Tabelle erstellen.
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'])
Ergebnis
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
In den Beispieldaten wird davon ausgegangen, dass ein bestimmtes Produkt drei Jahre lang in Tokio, Osaka und Yokohama verkauft wurde. cnt ist die Menge und der Preis ist der Stückpreis. Yokohama hat nur Daten für 2015.
Geben Sie jedem DataFrame einen Städtenamen und verbinden Sie ihn vertikal.
#Fügen Sie jedem DataFrame einen Städtenamen hinzu
tokyo['city'] = 'tokyo'
osaka['city'] = 'osaka'
yokohama['city'] = 'yokohama'
#Vertikal kombinieren
df = pd.concat([tokyo,osaka,yokohama], ignore_index=True)
Ergebnis
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
Mit der Methode apply können Sie eine einheitliche Verarbeitung für alle Spalten und Zeilen durchführen. In diesem Beispiel wird Achse = 1 angegeben, sodass der Lambda-Ausdruck zeilenweise aufgerufen wird.
** Berechnen Sie den Umsatz durch Multiplikation von Menge (cnt) und Stückpreis (Preis) **
#axis=Wenden Sie in 1 die Funktion auf jede Zeile an. Achse Achse='columns'Aber der gleiche Effekt.
#x.cnt * x.Der Preisanteil ist die Nummer*Stückpreis
df["sales"] = df.apply(lambda x:x.cnt * x.price,axis=1)
Ergebnis
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
** Beurteilen Sie das Kanto / Kansai-Gebiet anhand des Stadtnamens **
#'west' if x.city == 'osaka' else 'east'Ist eine ternäre Operation.
df["area"] = df.apply(lambda x:'west' if x.city == 'osaka' else 'east',axis=1)
Ergebnis
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
Listen Sie die Verkäufe für jedes Jahr in jeder Stadt auf. Pandas bearbeitet automatisch mit pivot_table, aber die Argumente sind kompliziert und gewöhnungsbedürftig. .. Dieses Mal habe ich auf [diese Seite] verwiesen (http://pbpython.com/pandas-pivot-table-explained.html).
#Erstellen Sie eine Tabelle mit cnt und Verkäufen mit Fläche und Stadt auf der horizontalen Achse und Jahr auf der vertikalen Achse.
#fill_Wert füllt den fehlenden Teil der Daten mit 0 aus.
df2 = pd.pivot_table(df,
index=['area','city'],
columns=['year'],
values=['cnt','sales'],
fill_value=0)
Ergebnis
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
Das Obige ist das Ausgabeergebnis von Python, aber wenn Sie es etwas verständlicher machen, sieht es so aus.
| cnt | sales <Spalte 1. Schicht(Kein Name)
|================|===================
year | 2013 2014 2015 | 2013 2014 2015 <Spalte 2. Schicht(Der Name ist Jahr)
==============|================|===================
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 <<Der Index hat auch zwei Ebenen. Die Namen sind Gebiet und Stadt.
Ich bin ziemlich nah an der Ausgabe, aber ich möchte, dass die Spalten in der Reihenfolge "Jahr"> "Menge, Umsatz" liegen, also Swap-Level. Bearbeiten mit DataFrame.swaplevel.html). (Wenn Sie wissen, wie man es mit Pivot alleine macht, lassen Sie es mich bitte wissen.)
** 2 Zeilen in Spalte tauschen **
#Das erste Argument, 0, zeigt auf die 0. Spalte der Spalte.
#Das zweite Argument, 1, zeigt auf die erste Spalte der Spalte.
df2=df2.swaplevel(0,1, axis=1)
Ergebnis (Jahr ist an den Anfang verschoben)
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
** Nach Jahr sortieren **
df3=df2[['2013','2014','2015']]
Ergebnis
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
Nachdem Sie die gewünschte Ausgabe erstellt haben, geben Sie sie in Excel aus.
#pip install openpyxl
writer = pd.ExcelWriter('output.xlsx')
df3.to_excel(writer,'Sheet1')
writer.save()
Der Rest wird durch Zeichnen von Linien und Färben erledigt. Es scheint, dass es mit openpyxl gemacht werden kann, aber diesmal habe ich es manuell mit Excel gemacht.
Recommended Posts