Uvod u Python Pandas

Sedmi deo

Rad sa nedostajućim vrednostima i čišćenje podataka

Rad sa nedostajućim vrednostima

U radu sa podacima se često susrećemo sa nedostajućim vrednostima. Ponekad korisnici zaborave da unesu sve podatke ili se podaci izgube prilikom uvoženja iz baze podataka, dok je ponekad u pitanju programska ili neka druga nenamerna greška.

Pre čišćenja skupa podataka bilo bi dobro da pregledamo podatke da imamo neku opštu sliku. U našem slučaju to znači da ćemo otvoriti csv tabelu i pregledati je da utvrdimo kog su tipa nedostajuće ili nedefinisane vrednosti.

Pogledajmo prvo da li ima nedostajućih vrednosti. Koristićemo metodu isnull() u kombinaciji sa metodom sum().

In [1]:
import pandas as pd
df = pd.read_csv('../datasets/data.csv')
df.head(3)
Out[1]:
Duration Pulse Maxpulse Calories
0 60 110.0 130 409.1
1 60 NaN 145 479.0
2 60 103.0 135 340.0
In [2]:
df.shape
Out[2]:
(169, 4)
In [3]:
df.isnull().head(3)
Out[3]:
Duration Pulse Maxpulse Calories
0 False False False False
1 False True False False
2 False False False False

Da bi utvrdili broj nedostajućih vrednosti u kolonama koristićemo metodu za sumiranje.

In [4]:
df.isnull().sum()
Out[4]:
Duration    0
Pulse       2
Maxpulse    0
Calories    5
dtype: int64

Vidimo da kolona Pulse ima dve, a kolona Calories ima pet nedostajućih vrednosti.

Uklanjanje je preporučljivo u slučaju kada imamo mali broj nedostajućih podataka. U ostalim slučajevima vršimo zamenu nedostajućih vrednosti. Uklonimo sada redove koji sadrže nedostajuće vrednosti.

In [5]:
# Uklanjanje redova koji sadrže prazne ćelije
new_df = df.dropna() # vraća novi DataFrame i neće promeniti original

new_df.head(3)
Out[5]:
Duration Pulse Maxpulse Calories
0 60 110.0 130 409.1
2 60 103.0 135 340.0
3 45 109.0 175 282.4
In [6]:
new_df.shape
Out[6]:
(162, 4)

Zamena praznih ćelija

In [7]:
df.fillna(300, inplace = True) # na sva prazna mesta u tabeli (početnom DataFreme-u) biće umetnuta vrednost 300
In [8]:
df.isnull().sum()
Out[8]:
Duration    0
Pulse       0
Maxpulse    0
Calories    0
dtype: int64

Primetimo da sada nema praznih ćelija u tabeli

In [9]:
# Zamena samo za određene kolone
import pandas as pd

df = pd.read_csv('../datasets/data.csv')
df
Out[9]:
Duration Pulse Maxpulse Calories
0 60 110.0 130 409.1
1 60 NaN 145 479.0
2 60 103.0 135 340.0
3 45 109.0 175 282.4
4 45 117.0 148 406.0
... ... ... ... ...
164 60 105.0 140 290.8
165 60 110.0 145 300.0
166 60 115.0 145 310.2
167 75 120.0 150 320.4
168 75 125.0 150 330.4

169 rows × 4 columns

In [10]:
df["Calories"].fillna(300, inplace = True) # na sva prazna mesta u koloni Calories biće umetnuta vrednost 300
print(df.to_string())
     Duration  Pulse  Maxpulse  Calories
0          60  110.0       130     409.1
1          60    NaN       145     479.0
2          60  103.0       135     340.0
3          45  109.0       175     282.4
4          45  117.0       148     406.0
5          60  102.0       127     300.0
6          60  110.0       136     374.0
7          45    NaN       134     253.3
8          30  109.0       133     195.1
9          60   98.0       124     269.0
10         60  103.0       147     329.3
11         60  100.0       120     250.7
12         60  106.0       128     345.3
13         60  104.0       132     379.3
14         60   98.0       123     275.0
15         60   98.0       120     215.2
16         60  100.0       120     300.0
17         45   90.0       112     300.0
18         60  103.0       123     323.0
19         45   97.0       125     243.0
20         60  108.0       131     364.2
21         45  100.0       119     282.0
22         60  130.0       101     300.0
23         45  105.0       132     246.0
24         60  102.0       126     334.5
25         60  100.0       120     250.0
26         60   92.0       118     241.0
27         60  103.0       132     300.0
28         60  100.0       132     280.0
29         60  102.0       129     380.3
30         60   92.0       115     243.0
31         45   90.0       112     180.1
32         60  101.0       124     299.0
33         60   93.0       113     223.0
34         60  107.0       136     361.0
35         60  114.0       140     415.0
36         60  102.0       127     300.0
37         60  100.0       120     300.0
38         60  100.0       120     300.0
39         45  104.0       129     266.0
40         45   90.0       112     180.1
41         60   98.0       126     286.0
42         60  100.0       122     329.4
43         60  111.0       138     400.0
44         60  111.0       131     397.0
45         60   99.0       119     273.0
46         60  109.0       153     387.6
47         45  111.0       136     300.0
48         45  108.0       129     298.0
49         60  111.0       139     397.6
50         60  107.0       136     380.2
51         80  123.0       146     643.1
52         60  106.0       130     263.0
53         60  118.0       151     486.0
54         30  136.0       175     238.0
55         60  121.0       146     450.7
56         60  118.0       121     413.0
57         45  115.0       144     305.0
58         20  153.0       172     226.4
59         45  123.0       152     321.0
60        210  108.0       160    1376.0
61        160  110.0       137    1034.4
62        160  109.0       135     853.0
63         45  118.0       141     341.0
64         20  110.0       130     131.4
65        180   90.0       130     800.4
66        150  105.0       135     873.4
67        150  107.0       130     816.0
68         20  106.0       136     110.4
69        300  108.0       143    1500.2
70        150   97.0       129    1115.0
71         60  109.0       153     387.6
72         90  100.0       127     700.0
73        150   97.0       127     953.2
74         45  114.0       146     304.0
75         90   98.0       125     563.2
76         45  105.0       134     251.0
77         45  110.0       141     300.0
78        120  100.0       130     500.4
79        270  100.0       131    1729.0
80         30  159.0       182     319.2
81         45  149.0       169     344.0
82         30  103.0       139     151.1
83        120  100.0       130     500.0
84         45  100.0       120     225.3
85         30  151.0       170     300.0
86         45  102.0       136     234.0
87        120  100.0       157    1000.1
88         45  129.0       103     242.0
89         20   83.0       107      50.3
90        180  101.0       127     600.1
91         45  107.0       137     300.0
92         30   90.0       107     105.3
93         15   80.0       100      50.5
94         20  150.0       171     127.4
95         20  151.0       168     229.4
96         30   95.0       128     128.2
97         25  152.0       168     244.2
98         30  109.0       131     188.2
99         90   93.0       124     604.1
100        20   95.0       112      77.7
101        90   90.0       110     500.0
102        90   90.0       100     500.0
103        90   90.0       100     500.4
104        30   92.0       108      92.7
105        30   93.0       128     124.0
106       180   90.0       120     800.3
107        30   90.0       120      86.2
108        90   90.0       120     500.3
109       210  137.0       184    1860.4
110        60  102.0       124     325.2
111        45  107.0       124     275.0
112        15  124.0       139     124.2
113        45  100.0       120     225.3
114        60  108.0       131     367.6
115        60  108.0       151     351.7
116        60  116.0       141     443.0
117        60   97.0       122     277.4
118        60  105.0       125     300.0
119        60  103.0       124     332.7
120        30  112.0       137     193.9
121        45  100.0       120     100.7
122        60  119.0       169     336.7
123        60  107.0       127     344.9
124        60  111.0       151     368.5
125        60   98.0       122     271.0
126        60   97.0       124     275.3
127        60  109.0       127     382.0
128        90   99.0       125     466.4
129        60  114.0       151     384.0
130        60  104.0       134     342.5
131        60  107.0       138     357.5
132        60  103.0       133     335.0
133        60  106.0       132     327.5
134        60  103.0       136     339.0
135        20  136.0       156     189.0
136        45  117.0       143     317.7
137        45  115.0       137     318.0
138        45  113.0       138     308.0
139        20  141.0       162     222.4
140        60  108.0       135     390.0
141        60   97.0       127     300.0
142        45  100.0       120     250.4
143        45  122.0       149     335.4
144        60  136.0       170     470.2
145        45  106.0       126     270.8
146        60  107.0       136     400.0
147        60  112.0       146     361.9
148        30  103.0       127     185.0
149        60  110.0       150     409.4
150        60  106.0       134     343.0
151        60  109.0       129     353.2
152        60  109.0       138     374.0
153        30  150.0       167     275.8
154        60  105.0       128     328.0
155        60  111.0       151     368.5
156        60   97.0       131     270.4
157        60  100.0       120     270.4
158        60  114.0       150     382.8
159        30   80.0       120     240.9
160        30   85.0       120     250.4
161        45   90.0       130     260.4
162        45   95.0       130     270.0
163        45  100.0       140     280.9
164        60  105.0       140     290.8
165        60  110.0       145     300.0
166        60  115.0       145     310.2
167        75  120.0       150     320.4
168        75  125.0       150     330.4
In [11]:
df.isnull().sum()
Out[11]:
Duration    0
Pulse       2
Maxpulse    0
Calories    0
dtype: int64

Nedostajuće vrednosti moguće je zameniti vrednostima aritmetičke sredine, medijane ili moda. U te svrhe prvo se vrši vizualizacija podataka iz kolona sa nedostajućim vrednostima pomoću box plot dijagrama i histograma, kako bismo se lakše odlučili koju od pomenutih vrednosti da umetnemo.

In [12]:
# primer zamene sa prosečnom vrednosti kolone Pulse
x = df["Pulse"].mean()
x
Out[12]:
107.42514970059881
In [13]:
df["Pulse"].fillna(x, inplace = True)
df
Out[13]:
Duration Pulse Maxpulse Calories
0 60 110.00000 130 409.1
1 60 107.42515 145 479.0
2 60 103.00000 135 340.0
3 45 109.00000 175 282.4
4 45 117.00000 148 406.0
... ... ... ... ...
164 60 105.00000 140 290.8
165 60 110.00000 145 300.0
166 60 115.00000 145 310.2
167 75 120.00000 150 320.4
168 75 125.00000 150 330.4

169 rows × 4 columns