In [1]:
from datetime import datetime
print(f'Päivitetty {datetime.now()}')
Päivitetty 2021-10-22 13:10:17.969850

Ryhmittelyjä groupby()-toiminnolla

In [2]:
import pandas as pd

df = pd.read_excel('http://taanila.fi/data1.xlsx')
df.head()
Out[2]:
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 [3]:
# Muuttujien tekstimuotoisia arvoja
sukup = ['Mies', 'Nainen']
koulutus = ['Peruskoulu', '2. aste', 'Korkeakoulu', 'Ylempi korkeakoulu']
In [4]:
# Palkan tunnuslukuja koulutuksen määräämissä ryhmissä
df1 = df.groupby('koulutus')['palkka'].describe()

# Koulutuksen tekstimuotoiset arvot numeroiden 1, 2, 3, 4 sijasta
df1.index = koulutus

# Esitän tulokset ilman desimaaleja
df1.style.format('{:.0f}')
Out[4]:
  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 [5]:
# Palkkakeskiarvoja sukupuolen ja koulutuksen määräämissä ryhmissä
# unstack() siirtää koulutukset sarakkeisiin
df2 = df.groupby(['sukup', 'koulutus'])['palkka'].mean().unstack()

# Sukupuolen ja koulutuksen tekstimuotoiset arvot
df2.index = sukup
df2.columns = koulutus

# Esitän tulokset ilman desimaaleja
# puuttuvan arvon tilalle '-'
df2.style.format('{:.0f}', na_rep = '-')
Out[5]:
  Peruskoulu 2. aste Korkeakoulu Ylempi korkeakoulu
Mies 2354 2461 3145 5147
Nainen 2121 2211 2334 -
In [6]:
# Edellisen voin toteuttaa myös pivot_table()-toiminnolla
df3 = df.pivot_table(values = 'palkka', index = 'sukup', columns = 'koulutus')
df3.index = sukup
df3.columns = koulutus
df3.style.format('{:.0f}', na_rep = '-')
Out[6]:
  Peruskoulu 2. aste Korkeakoulu Ylempi korkeakoulu
Mies 2354 2461 3145 5147
Nainen 2121 2211 2334 -
In [7]:
# Keskiarvoja palkalle ja palkkatyytyväisyydelle koulutuksen ja sukupuolen määräämissä ryhmissä
df4 = df.groupby(['koulutus', 'sukup'])[['palkka', 'palkkat']].mean()

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

# Esitän palkkakeskiarvot ilman desimaaleja ja palkkatyytyväisyydet yhdellä desimaalilla
df4.style.format({'palkka' : '{:.0f}', 'palkkat' : '{:.1f}'})
Out[7]:
    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 [8]:
# Tyytyväisyyskeskiarvoja sukupuolen ja koulutuksen mukaan
df5 = df.groupby(['sukup', 'koulutus'])[['johto', 'työtov', 'työymp',
                                         'palkkat', 'työteht']].mean()

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

# Esitän tulokset yhdellä desimaalilla
df5.style.format('{:.1f}')
Out[8]:
    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 [9]:
# Keskiarvopalkat hierojaa käyttäneille sukupuolittain
df6 = df[df['hieroja'] == 1].groupby('sukup')['palkka'].mean()

# Sukupuolen tekstimuotoiset arvot
df6.index = sukup

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

# Sukupuolten oikeat nimet numeroiden sijasta
df7.index = sukup

# Esitän tulokset ilman desimaaleja
df7.style.format('{:.0f}')
Out[10]:
  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

Lisätietoa

Data-analytiikka Pythonilla: https://tilastoapu.wordpress.com/python/

In [11]:
pd.show_versions()
INSTALLED VERSIONS
------------------
commit           : 73c68257545b5f8530b7044f56647bd2db92e2ba
python           : 3.9.7.final.0
python-bits      : 64
OS               : Windows
OS-release       : 10
Version          : 10.0.19041
machine          : AMD64
processor        : Intel64 Family 6 Model 158 Stepping 10, GenuineIntel
byteorder        : little
LC_ALL           : None
LANG             : None
LOCALE           : Finnish_Finland.1252

pandas           : 1.3.3
numpy            : 1.20.3
pytz             : 2021.3
dateutil         : 2.8.2
pip              : 21.2.4
setuptools       : 58.0.4
Cython           : None
pytest           : None
hypothesis       : None
sphinx           : None
blosc            : None
feather          : None
xlsxwriter       : 3.0.1
lxml.etree       : 4.6.3
html5lib         : None
pymysql          : None
psycopg2         : None
jinja2           : 3.0.1
IPython          : 7.27.0
pandas_datareader: 0.10.0
bs4              : None
bottleneck       : 1.3.2
fsspec           : None
fastparquet      : None
gcsfs            : None
matplotlib       : 3.4.2
numexpr          : 2.7.3
odfpy            : None
openpyxl         : 3.0.9
pandas_gbq       : None
pyarrow          : None
pyxlsb           : None
s3fs             : None
scipy            : 1.7.1
sqlalchemy       : None
tables           : None
tabulate         : 0.8.9
xarray           : None
xlrd             : 2.0.1
xlwt             : None
numba            : None