Puuduvad väärtused on tavalised ja ilmnevad kas inimliku vea, instrumendi vea, teise meeskonna töötlemise või muul viisil lihtsalt andmete puudumise tõttu teatud vaatluse jaoks.
Selles baidis vaatleme, kuidas täita NaN-e a
DataFrame
, kui otsustate NaN-e käsitleda nende täitmisega.
Alustuseks loome maketi DataFrame
mõne juhusliku väärtusega välja langenud:
import numpy as np
array = np.random.randn(25, 3)
mask = np.random.choice([1, 0], array.shape, p=[.3, .7]).astype(bool)
array[mask] = np.nan
df = pd.DataFrame(array, columns=['Col1', 'Col2', 'Col3'])
Col1 Col2 Col3
0 -0.671603 -0.792415 0.783922
1 0.207720 NaN 0.996131
2 -0.892115 -1.282333 NaN
3 -0.315598 -2.371529 -1.959646
4 NaN NaN -0.584636
5 0.314736 -0.692732 -0.303951
6 0.355121 NaN NaN
7 NaN -1.900148 1.230828
8 -1.795468 0.490953 NaN
9 -0.678491 -0.087815 NaN
10 0.755714 0.550589 -0.702019
11 0.951908 -0.529933 0.344544
12 NaN 0.075340 -0.187669
13 NaN 0.314342 -0.936066
14 NaN 1.293355 0.098964
Joonistame näiteks kolmanda veeru:
plt.plot(df['Col3'])
Erinevate tehnikatega täidetuna saab selle NaN-ga täidetud graafiku asendada järgmisega:
fillna() – keskmine, mediaan, režiim
Saate need väärtused täita uude veergu ja määrata selle veerule, mida soovite täita, või kohapeal, kasutades inplace
argument. Siin eraldame kontrollimise hõlbustamiseks täidetud väärtused uude veergu:
mean = df['Col3'].fillna(df['Col3'].mean(), inplace=False)
median = df['Col3'].fillna(df['Col3'].median(), inplace=False)
mode = df['Col3'].fillna(df['Col3'].mode(), inplace=False)
Veeru mediaan, keskmine ja moodus on -0.187669
, -0.110873
ja 0.000000
ja neid väärtusi kasutatakse vastavalt iga NaN jaoks. See on sisuliselt konstantsete väärtustega täitmine, kus sisestatav väärtus sõltub veeru kirjest.
Esiteks, mediaanväärtustega täitmine annab tulemuseks:
Keskmiste väärtustega:
Režiimi väärtustega:
fillna() – püsiväärtus
Selle asemel võite täita ka konstantse väärtusega:
Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!
constant = df['Col3'].fillna(0, inplace=False
Selle tulemuseks on iga NaN asemel konstantne väärtus (0). 0
on lähedane meie mediaanile ja keskmisele ning võrdne režiimiga, nii et täidetud väärtused sarnanevad meie näidisandmestiku jaoks selle meetodiga:
0 0.783922
1 0.996131
2 0.000000
3 -1.959646
4 -0.584636
5 -0.303951
6 0.000000
7 1.230828
8 0.000000
9 0.000000
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
fillna() – edasi- ja tagasitäitmine
Igal real – saate täita edasi või tagasi, võttes väärtuse kas enne või pärast olevast reast:
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
Edasitäitmisega, kuna meil puudub 2. reast, võetakse rea 1 väärtus teise täiteks. Väärtused levivad edasi:
0 0.783922
1 0.996131
2 0.996131
3 -1.959646
4 -0.584636
5 -0.303951
6 -0.303951
7 1.230828
8 1.230828
9 1.230828
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
Tagurpidi täitmisega juhtub vastupidine. 2. rida täidetakse 3. rea väärtusega:
0 0.783922
1 0.996131
2 -1.959646
3 -1.959646
4 -0.584636
5 -0.303951
6 1.230828
7 1.230828
8 -0.702019
9 -0.702019
10 -0.702019
11 0.344544
12 -0.187669
13 -0.936066
14 0.098964
Siiski, kui neid on rohkem kui üks NaN
järjestuses – need ei tööta hästi ja võivad NaN-e veelgi allapoole kaskaadida, moonutades andmeid ja eemaldades tegelikult salvestatud väärtused.
interpoleerida ()
. interpolate()
meetod delegeerib väärtuste interpoleerimise SciPy'le meetodite komplekt väärtuste interpoleerimiseks. See aktsepteerib mitmesuguseid argumente, sealhulgas nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
Jne
Interpoleerimine on palju paindlikum ja "targem" kui lihtsalt väärtuste täitmine konstantide või poolmuutujatega, nagu näiteks eelmised meetodid.
Interpoleerimine suudab jada õigesti täita viisil, mida ükski teine meetod ei suuda, näiteks:
s = pd.Series([0, 1, np.nan, np.nan, np.nan, 5])
s.fillna(s.mean()).values
s.fillna(method='ffill').values
s.interpolate().values
Vaikimisi interpolatsioon on lineaarne ja seda eeldades 1...5
tõenäoliselt a 1, 2, 3, 4, 5
järjestus pole kaugelt ammutatud (kuid pole garanteeritud). Nii pidev täitmine kui ka edasi- või tagasitäitmine ebaõnnestuvad siin haledalt. Üldiselt on interpoleerimine tavaliselt hea sõber, kui tegemist on NaN-ide täitmisega mürasignaalides või rikutud andmekogumites.
Interpolatsiooni tüüpidega katsetamine võib anda paremaid tulemusi.
Siin on kaks interpolatsioonimeetodit (splice
ja polynomial
nõuda order
argument):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
Nende tulemuseks on:
Ja: