Temppuja DataFramella

Seuraavilla koodeilla

  • avaan Excel-muotoisen datan read_excel()
  • selvitän datan rivien ja sarakkeiden määrän shape
  • näytän eri sarakkeiden arvojen määrän count()
  • järjestän sort_values()
  • suodatan
  • lasken uusia sarakkeita olemassa olevien pohjalta
  • lasken frekvenssejä value_counts()
  • lasken tunnuslukuja describe()
  • lasken korrelaatioita corr()
  • lasken palkkaansa tyytyväisten palkkakeskiarvon.
In [1]:
#otan käyttöön pandas-ohjelmakirjaston
import pandas as pd

#avaan Excel-datan dataframeen, jonka nimeksi annan df
df = pd.read_excel('http://taanila.fi/data1.xlsx')

#näytän df:n viisi ensimmäistä riviä 
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]:
#minkä kokoinen data?
df.shape
Out[2]:
(82, 16)
In [3]:
#kuinka monta arvoa kussakin sarakkeessa?
df.count()
Out[3]:
nro         82
sukup       82
ikä         82
perhe       82
koulutus    81
palveluv    80
palkka      82
johto       82
työtov      81
työymp      82
palkkat     82
työteht     82
työterv     47
lomaosa     20
kuntosa      9
hieroja     22
dtype: int64
In [4]:
#data palkan mukaisessa järjestyksessä 
#lisäparametrilla ascending=False voin kääntää järjestyksen
df.sort_values('palkka', ascending=False).head()
Out[4]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
32 33 1 59 2 3.0 15.0 6278 4 4.0 5 4 4 NaN 1.0 NaN NaN
16 17 1 26 1 4.0 2.0 5225 5 5.0 5 4 5 NaN NaN 1.0 NaN
66 67 1 37 2 4.0 8.0 5069 3 4.0 3 2 2 1.0 1.0 NaN 1.0
21 22 1 47 2 3.0 17.0 4874 2 4.0 3 2 4 NaN 1.0 NaN NaN
23 24 1 36 1 3.0 7.0 4446 3 4.0 3 4 5 NaN NaN NaN NaN
In [5]:
#ne, joiden tyytyväisyys johtoon on pienempi kuin 3 (1=erittäin tyytymätön, 2=tyytymätön)
df[df['johto'] < 3]
Out[5]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
1 2 1 29 2 2.0 10.0 2963 1 5.0 2 1 3 NaN NaN NaN NaN
4 5 1 24 1 2.0 4.0 2183 2 3.0 2 1 2 1.0 NaN NaN NaN
8 9 1 40 2 1.0 23.0 2768 2 4.0 4 2 4 NaN 1.0 NaN NaN
18 19 1 42 1 3.0 20.0 2925 2 3.0 4 1 4 1.0 NaN NaN 1.0
20 21 2 40 2 3.0 20.0 2691 2 4.0 5 3 4 NaN NaN NaN NaN
21 22 1 47 2 3.0 17.0 4874 2 4.0 3 2 4 NaN 1.0 NaN NaN
25 26 1 26 1 2.0 3.0 1521 2 4.0 2 1 3 1.0 NaN 1.0 1.0
26 27 1 26 1 2.0 2.0 1989 2 4.0 2 2 3 1.0 NaN NaN 1.0
28 29 1 47 2 2.0 23.0 2808 2 4.0 3 1 4 1.0 NaN NaN NaN
33 34 1 37 2 1.0 14.0 2183 1 5.0 1 1 2 1.0 NaN NaN 1.0
35 36 1 31 2 3.0 0.0 1559 2 4.0 3 1 3 1.0 NaN NaN NaN
39 40 1 32 1 1.0 3.0 2106 1 5.0 4 1 3 1.0 NaN NaN NaN
43 44 1 30 1 2.0 7.0 2223 2 3.0 4 1 3 1.0 NaN NaN 1.0
52 53 1 44 2 1.0 3.0 1989 1 2.0 2 1 1 1.0 NaN NaN NaN
53 54 1 25 1 2.0 1.0 1559 2 4.0 3 1 2 1.0 NaN NaN NaN
56 57 1 61 2 2.0 36.0 3119 2 NaN 2 1 5 1.0 NaN NaN 1.0
57 58 1 38 2 2.0 NaN 2574 2 3.0 1 1 2 1.0 NaN NaN 1.0
60 61 1 44 1 1.0 19.0 2183 2 2.0 1 1 2 1.0 NaN NaN NaN
61 62 1 40 2 1.0 0.0 1872 2 3.0 1 2 3 1.0 NaN NaN NaN
67 68 1 33 2 3.0 7.0 2417 2 4.0 3 1 4 NaN NaN NaN NaN
74 75 1 40 1 1.0 1.0 1949 1 5.0 1 1 1 1.0 NaN NaN NaN
75 76 1 37 1 2.0 15.0 1598 1 5.0 1 1 1 1.0 NaN NaN NaN
78 79 1 33 1 1.0 2.0 1638 1 3.0 2 1 2 1.0 NaN NaN NaN
In [6]:
#ne, joilla palvelusvuosia vähemmän kuin kaksi ja tyytyväisyys johtoon on 1 (erittän tyytymätön)
df[(df['palveluv'] < 2) & (df['johto'] == 1)]
Out[6]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja
74 75 1 40 1 1.0 1.0 1949 1 5.0 1 1 1 1.0 NaN NaN NaN
In [7]:
#lasken palkan päälle 5 % bonuksen
df['bonus'] = df['palkka'] * 0.05

#lisään yhteensä-sarakkeen
df['yhteensä'] = df['palkka'] + df['bonus']

#viisi ensimmäistä riviä sarakkeista 'palkka', 'bonus' ja 'yhteensä'
df[['palkka', 'bonus', 'yhteensä']].head()
Out[7]:
palkka bonus yhteensä
0 3587 179.35 3766.35
1 2963 148.15 3111.15
2 1989 99.45 2088.45
3 2144 107.20 2251.20
4 2183 109.15 2292.15
In [8]:
#lisään vielä 3 prosentin lisäbonuksen alle 3000 palkoille
df['lisäbonus'] = (df['palkka'] < 3000) * 0.03 * df['palkka']
df[['palkka', 'bonus', 'yhteensä', 'lisäbonus']].head()
Out[8]:
palkka bonus yhteensä lisäbonus
0 3587 179.35 3766.35 0.00
1 2963 148.15 3111.15 88.89
2 1989 99.45 2088.45 59.67
3 2144 107.20 2251.20 64.32
4 2183 109.15 2292.15 65.49
In [9]:
#lasken eri koulutuksen suorittaneiden lukumäärät lukumäärän mukaan järjestettynä
df['koulutus'].value_counts()
Out[9]:
2.0    30
1.0    27
3.0    22
4.0     2
Name: koulutus, dtype: int64
In [10]:
#lasken eri koulutuksen suorittaneiden lukumäärät koulutuksen mukaan järjestettynä
df['koulutus'].value_counts(sort = False)
Out[10]:
1.0    27
2.0    30
3.0    22
4.0     2
Name: koulutus, dtype: int64
In [11]:
#lasken tunnusluvut jokaiselle sarakkeelle
df.describe()
Out[11]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja bonus yhteensä lisäbonus
count 82.000000 82.000000 82.000000 82.000000 81.000000 80.000000 82.000000 82.000000 81.000000 82.000000 82.000000 82.000000 47.0 20.0 9.0 22.0 82.000000 82.000000 82.000000
mean 41.500000 1.231707 37.951220 1.621951 1.987654 12.175000 2563.878049 3.060976 4.061728 3.219512 2.109756 3.195122 1.0 1.0 1.0 1.0 128.193902 2692.071951 57.457683
std 23.815261 0.424519 9.773866 0.487884 0.844006 8.807038 849.350302 1.058155 0.826826 1.154961 1.111179 1.047502 0.0 0.0 0.0 0.0 42.467515 891.817817 27.355744
min 1.000000 1.000000 20.000000 1.000000 1.000000 0.000000 1521.000000 1.000000 2.000000 1.000000 1.000000 1.000000 1.0 1.0 1.0 1.0 76.050000 1597.050000 0.000000
25% 21.250000 1.000000 31.000000 1.000000 1.000000 3.750000 2027.000000 2.000000 4.000000 3.000000 1.000000 3.000000 1.0 1.0 1.0 1.0 101.350000 2128.350000 56.160000
50% 41.500000 1.000000 37.500000 2.000000 2.000000 12.500000 2320.000000 3.000000 4.000000 3.000000 2.000000 3.000000 1.0 1.0 1.0 1.0 116.000000 2436.000000 64.320000
75% 61.750000 1.000000 44.000000 2.000000 3.000000 18.250000 2808.000000 4.000000 5.000000 4.000000 3.000000 4.000000 1.0 1.0 1.0 1.0 140.400000 2948.400000 76.920000
max 82.000000 2.000000 61.000000 2.000000 4.000000 36.000000 6278.000000 5.000000 5.000000 5.000000 5.000000 5.000000 1.0 1.0 1.0 1.0 313.900000 6591.900000 88.890000
In [12]:
#lasken muuttujien väliset korrelaatiokertoimet
df.corr()
Out[12]:
nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp palkkat työteht työterv lomaosa kuntosa hieroja bonus yhteensä lisäbonus
nro 1.000000 0.083647 -0.069163 0.027095 -0.050974 -0.153504 -0.192810 0.018371 0.052791 -0.070468 -0.024959 -0.025239 NaN NaN NaN NaN -0.192810 -0.192810 -0.018063
sukup 0.083647 1.000000 0.154505 0.249334 0.077620 0.143230 -0.215426 0.325442 -0.147959 0.348216 0.337999 0.174702 NaN NaN NaN NaN -0.215426 -0.215426 0.192381
ikä -0.069163 0.154505 1.000000 0.412914 -0.157863 0.531559 0.296872 0.120856 0.077554 0.101577 0.072114 0.187848 NaN NaN NaN NaN 0.296872 0.296872 -0.213012
perhe 0.027095 0.249334 0.412914 1.000000 0.049670 0.345915 0.239839 0.212600 0.090063 0.280548 0.214119 0.315220 NaN NaN NaN NaN 0.239839 0.239839 0.033327
koulutus -0.050974 0.077620 -0.157863 0.049670 1.000000 -0.145238 0.422408 0.140477 -0.016793 0.296007 0.254002 0.158809 NaN NaN NaN NaN 0.422408 0.422408 -0.200641
palveluv -0.153504 0.143230 0.531559 0.345915 -0.145238 1.000000 0.243139 0.073422 0.019732 0.126504 0.004420 0.143100 NaN NaN NaN NaN 0.243139 0.243139 -0.032076
palkka -0.192810 -0.215426 0.296872 0.239839 0.422408 0.243139 1.000000 0.174133 0.117468 0.267615 0.314889 0.307886 NaN NaN NaN NaN 1.000000 1.000000 -0.550208
johto 0.018371 0.325442 0.120856 0.212600 0.140477 0.073422 0.174133 1.000000 0.223328 0.584918 0.540228 0.456933 NaN NaN NaN NaN 0.174133 0.174133 -0.087201
työtov 0.052791 -0.147959 0.077554 0.090063 -0.016793 0.019732 0.117468 0.223328 1.000000 0.285940 0.086845 0.308939 NaN NaN NaN NaN 0.117468 0.117468 -0.042233
työymp -0.070468 0.348216 0.101577 0.280548 0.296007 0.126504 0.267615 0.584918 0.285940 1.000000 0.538940 0.576431 NaN NaN NaN NaN 0.267615 0.267615 -0.051317
palkkat -0.024959 0.337999 0.072114 0.214119 0.254002 0.004420 0.314889 0.540228 0.086845 0.538940 1.000000 0.479884 NaN NaN NaN NaN 0.314889 0.314889 -0.153953
työteht -0.025239 0.174702 0.187848 0.315220 0.158809 0.143100 0.307886 0.456933 0.308939 0.576431 0.479884 1.000000 NaN NaN NaN NaN 0.307886 0.307886 -0.127455
työterv NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
lomaosa NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
kuntosa NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
hieroja NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
bonus -0.192810 -0.215426 0.296872 0.239839 0.422408 0.243139 1.000000 0.174133 0.117468 0.267615 0.314889 0.307886 NaN NaN NaN NaN 1.000000 1.000000 -0.550208
yhteensä -0.192810 -0.215426 0.296872 0.239839 0.422408 0.243139 1.000000 0.174133 0.117468 0.267615 0.314889 0.307886 NaN NaN NaN NaN 1.000000 1.000000 -0.550208
lisäbonus -0.018063 0.192381 -0.213012 0.033327 -0.200641 -0.032076 -0.550208 -0.087201 -0.042233 -0.051317 -0.153953 -0.127455 NaN NaN NaN NaN -0.550208 -0.550208 1.000000
In [13]:
#lasken palkkakeskiarvon niille, joiden tyytyväisyys palkkaan on 4 (tyytyväinen) 
#tai 5 (erittäin tyytyväinen)
df[df['palkkat'] >=4]['palkka'].mean()
Out[13]:
3374.818181818182