In [1]:
from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2022-04-28 / Aki Taanila

Pivot-taulukot

Pivot-taulukoita luon pivot_table-funktiolla. Keskeisiä parametreja ovat

  • values - laskettavat muuttujat
  • index - rivimuuttujat
  • columns - sarakemuuttujat
  • aggfunc - arvojen laskentamenetelmät (oletuksena pivot-taulukkoon lasketaan keskiarvoja)

Jos lasket pelkästään lukumääriä ja/tai prosentteja, niin pivot_table-funktion sijasta kannattaa käyttää crosstab-funktiota, joka laskee oletuksena lukumääriä.

In [2]:
import pandas as pd
In [3]:
# Esimerkkidatana pienoismallien valmistajan saamia tilauksia
df = pd.read_excel('https://taanila.fi/pienoismallit.xlsx')
df
Out[3]:
NRO KAPPALEMÄÄRÄ YKSIKKÖHINTA HINTA VUOSI TUOTELINJA TUOTENUMERO MAA TILAUKSEN_KOKO
0 1 30 95.70 2871.00 2018 Moottoripyörät S10_1678 USA Pieni
1 2 34 81.35 2765.90 2018 Moottoripyörät S10_1678 France Pieni
2 3 41 94.74 3884.34 2018 Moottoripyörät S10_1678 France Keskikoko
3 4 45 83.26 3746.70 2018 Moottoripyörät S10_1678 USA Keskikoko
4 5 49 100.00 5205.27 2018 Moottoripyörät S10_1678 USA Keskikoko
... ... ... ... ... ... ... ... ... ...
2818 2819 20 100.00 2244.40 2019 Laivat S72_3212 Spain Pieni
2819 2820 29 100.00 3978.51 2020 Laivat S72_3212 Finland Keskikoko
2820 2821 43 100.00 5417.57 2020 Laivat S72_3212 Spain Keskikoko
2821 2822 34 62.24 2116.16 2020 Laivat S72_3212 France Pieni
2822 2823 47 65.52 3079.44 2020 Laivat S72_3212 USA Keskikoko

2823 rows × 9 columns

In [4]:
# Tilausten keskiarvohinta eri vuosina
df.pivot_table(values='HINTA', index='VUOSI')
Out[4]:
HINTA
VUOSI
2018 3516.979540
2019 3512.388550
2020 3747.880146
In [5]:
# Tilausten hinta yhteensä tuotelinjan mukaan
df.pivot_table(values='HINTA', index='TUOTELINJA', aggfunc=sum).sort_values(by='HINTA', ascending=False)
Out[5]:
HINTA
TUOTELINJA
Klassikko autot 3919615.66
Vintage autot 1903150.84
Moottoripyörät 1166388.34
Rekat ja bussit 1127789.84
Lentokoneet 975003.57
Laivat 714437.13
Junat 226243.47
In [6]:
# Tilausten keskiarvohinta eri vuosina tuotelinjan mukaan
df.pivot_table(values='HINTA', index='TUOTELINJA', columns='VUOSI').style.format(precision=0)\
                                                                   .background_gradient(cmap='Reds', axis=None)
Out[6]:
VUOSI 2018 2019 2020
TUOTELINJA      
Junat 2600 3149 3076
Klassikko autot 4057 3987 4230
Laivat 3022 2969 3373
Lentokoneet 3203 3122 3335
Moottoripyörät 3403 3418 4051
Rekat ja bussit 3822 3727 3634
Vintage autot 2946 3209 3341
In [7]:
# Tilausten sisältämien kappalemäärien keskiarvo maan ja tuotelinjan mukaan
# Kunkin sarakkeen suurin ja pienin arvo korostettu
df.pivot_table(values='KAPPALEMÄÄRÄ', index='MAA', columns='TUOTELINJA').style.format(precision=0, na_rep='-')\
                                                                   .highlight_max(color='lightgreen', axis=0)\
                                                                   .highlight_min(color='pink', axis=0)
Out[7]:
TUOTELINJA Junat Klassikko autot Laivat Lentokoneet Moottoripyörät Rekat ja bussit Vintage autot
MAA              
Australia 33 34 28 33 34 35 34
Austria - 37 28 33 39 41 32
Belgium 32 37 31 41 - - 32
Canada - 33 35 32 41 32 32
Denmark 34 37 31 35 - 36 34
Finland 44 34 35 35 34 35 36
France 32 36 36 36 35 36 34
Germany 44 36 28 31 40 40 31
Ireland 25 34 - 29 29 37 28
Italy 27 34 32 36 38 24 32
Japan 24 39 42 34 34 34 35
Norway 36 33 - 30 35 34 35
Philippines - 37 - 43 34 - 27
Singapore 35 33 44 - 44 39 31
Spain 36 36 36 37 41 37 35
Sweden 32 32 37 35 44 39 32
Switzerland - 35 - - - - -
UK 42 33 36 32 41 36 35
USA 36 35 34 37 34 35 37
In [8]:
# Tilausten hinnan keskiarvo, summa ja tilausten lukumäärä tuotelinjan mukaan
df1 = df.pivot_table(values='HINTA', index='TUOTELINJA', aggfunc=['mean', sum, len])

# Sarakeotsikot
df1.columns = ['Keskiarvo', 'Yhteensä', 'Lukumäärä']

df1.style.format(precision=0).background_gradient(cmap='Reds', axis=0)
Out[8]:
  Keskiarvo Yhteensä Lukumäärä
TUOTELINJA      
Junat 2938 226243 77
Klassikko autot 4053 3919616 967
Laivat 3053 714437 234
Lentokoneet 3186 975004 306
Moottoripyörät 3524 1166388 331
Rekat ja bussit 3747 1127790 301
Vintage autot 3135 1903151 607
In [9]:
# Tunnuslukuja vuoden ja tuotelinjan mukaan
df.pivot_table(values='HINTA', index=['VUOSI', 'TUOTELINJA'], aggfunc=[min, 'median', max]).style.format(precision=0)
Out[9]:
    min median max
    HINTA HINTA HINTA
VUOSI TUOTELINJA      
2018 Junat 972 2447 5344
Klassikko autot 717 3807 11279
Laivat 1134 2897 6341
Lentokoneet 876 2949 7484
Moottoripyörät 1036 3026 9265
Rekat ja bussit 1104 3585 7083
Vintage autot 710 2571 7956
2019 Junat 1056 2471 6491
Klassikko autot 813 3629 11624
Laivat 1089 2819 6960
Lentokoneet 949 2818 8160
Moottoripyörät 652 3000 9774
Rekat ja bussit 728 3410 8844
Vintage autot 578 2922 12536
2020 Junat 1193 2218 8977
Klassikko autot 640 3880 12001
Laivat 1463 3167 6397
Lentokoneet 1122 2878 10067
Moottoripyörät 733 3749 11887
Rekat ja bussit 482 3160 8498
Vintage autot 541 3029 14083