Ryhmittelyjä groupby()-toiminnolla

Tätä työkalua ei kannata ohittaa!

In [1]:
#otan käyttöön pandas-ohjelmakirjaston
import pandas as pd

#avaan Excel-datan dataframeen ja näytän viisi ensimmäistä riviä
df = pd.read_excel('http://taanila.fi/data1.xlsx')
df.head()
Out[1]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
0 1 1 38 1 1.0 22.0 3587 3 3.0 3 3 3 NaN NaN NaN NaN
1 2 1 29 2 2.0 10.0 2963 1 5.0 2 1 3 NaN NaN NaN NaN
2 3 1 30 1 1.0 7.0 1989 3 4.0 1 1 3 1.0 NaN NaN NaN
3 4 1 36 2 1.0 14.0 2144 3 3.0 3 3 3 1.0 NaN NaN NaN
4 5 1 24 1 2.0 4.0 2183 2 3.0 2 1 2 1.0 NaN NaN NaN
In [2]:
#kaksi listaa, joita hyödynnän jatkossa
sukup = ['Mies','Nainen']
koulutus = ['Peruskoulu','2. aste','Korkeakoulu','Ylempi korkeakoulu']
In [3]:
#palkan tunnuslukuja koulutuksen määräämissä ryhmissä
df1 = df.groupby('koulutus')['palkka'].describe()

#koulutusten oikeat nimet numeroiden 1, 2, 3, 4 sijasta
df1.index = koulutus

#esitän tulokset ilman desimaaleja
df1.style.format('{:.0f}')
Out[3]:
count mean std min 25% 50% 75% max
Peruskoulu 27 2310 473 1638 2008 2144 2534 3587
2. aste 30 2403 534 1521 2008 2378 2729 3510
Korkeakoulu 22 2887 1108 1559 2222 2710 2925 6278
Ylempi korkeakoulu 2 5147 110 5069 5108 5147 5186 5225
In [4]:
#palkkakeskiarvoja sukupuolen ja koulutuksen määräämissä ryhmissä
#unstack() siirtää koulutukset sarakkeisiin
df2 = df.groupby(['sukup','koulutus'])['palkka'].mean().unstack()

#sukupuolen ja koulutuksen arvojen nimet numeroiden sijasta
df2.index = sukup
df2.columns = koulutus

#esitän tulokset ilman desimaaleja
#'nan' tarkoittaa puuttuvaa arvoa
df2.style.format('{:.0f}')
Out[4]:
Peruskoulu 2. aste Korkeakoulu Ylempi korkeakoulu
Mies 2354 2461 3145 5147
Nainen 2121 2211 2334 nan
In [6]:
#edellisen voin toteuttaa myös pivot_table()-funktiolla
dfx = df.pivot_table(values='palkka', index='sukup', columns='koulutus')
dfx.index = sukup
dfx.columns = koulutus
dfx.style.format('{:.0f}')
Out[6]:
Peruskoulu 2. aste Korkeakoulu Ylempi korkeakoulu
Mies 2354 2461 3145 5147
Nainen 2121 2211 2334 nan
In [5]:
#keskiarvoja palkalle ja palkkatyytyväisyydelle koulutuksen ja sukupuolen määräämissä ryhmissä
df3 = df.groupby(['koulutus', 'sukup'])[['palkka','palkkat']].mean()

#hierarkinen (koulutus, sukupuoli) indeksi vaatii omat niksinsä tekstiarvojen sijoittamiseen
df3.index = df3.index.set_levels(koulutus, level=0)
df3.index = df3.index.set_levels(sukup, level=1)
df3

#esitän palkkakeskiarvot ilman desimaaleja ja palkkatyytyväisyydet yhdellä desimaalilla
df3.style.format({'palkka':'{:.0f}','palkkat':'{:.1f}'})
Out[5]:
palkka palkkat
koulutus sukup
Peruskoulu Mies 2354 1.6
Nainen 2121 2.8
2. aste Mies 2461 1.8
Nainen 2211 2.9
Korkeakoulu Mies 3145 2.3
Nainen 2334 2.7
Ylempi korkeakoulu Mies 5147 3.0
In [6]:
#tyytyväisyyskeskiarvoja sukupuolen ja koulutuksen mukaan
df4 = df.groupby(['sukup', 'koulutus'])[['johto','työtov','työymp',
                                         'palkkat','työteht']].mean()

#Hierarkinen (sukupuoli, koulutus) indeksi vaatii omat niksinsä tekstiarvojen sijoittamiseen
df4.index = df4.index.set_levels(sukup, level=0)
df4.index = df4.index.set_levels(koulutus, level=1)

#esitän tulokset yhdellä desimaalilla
df4.style.format('{:.1f}')
Out[6]:
johto työtov työymp palkkat työteht
sukup koulutus
Mies Peruskoulu 2.8 4.0 2.7 1.6 2.9
2. aste 2.6 4.2 2.9 1.8 3.0
Korkeakoulu 3.1 4.1 3.5 2.3 3.5
Ylempi korkeakoulu 4.0 4.5 4.0 3.0 3.5
Nainen Peruskoulu 3.6 4.2 3.6 2.8 3.6
2. aste 4.0 4.0 4.1 2.9 3.7
Korkeakoulu 3.4 3.4 4.0 2.7 3.3
In [7]:
#keskiarvopalkat hierojaa käyttäneille sukupuolittain
df5 = df[df['hieroja'] == 1].groupby('sukup')['palkka'].mean()

#sukupuolten oikeat nimet numeroiden sijasta
df5.index = sukup

#mean-funktiolla laskettu yksisarakkeinen tulostaulukko ei ole dataframe,
#joten muunnan sen dataframeksi
pd.DataFrame(df5).style.format('{:.0f}')
Out[7]:
palkka
Mies 2658
Nainen 2318
In [8]:
#palkan tunnuslukuja sukupuolittain hierojaa ja työterveyshuoltoa käyttäneillä
df6 = df[(df['hieroja'] == 1) & (df['työterv'] == 1)].groupby('sukup')['palkka'].describe()

#sukupuolten oikeat nimet numeroiden sijasta
df6.index = sukup

#esitän tulokset ilman desimaaleja
df6.style.format('{:.0f}')
Out[8]:
count mean std min 25% 50% 75% max
Mies 12 2642 905 1521 2134 2457 2974 5069
Nainen 7 2245 382 1715 1969 2223 2574 2691