A hiányzó értékek gyakoriak, és emberi hiba, műszerhiba, egy másik csapat feldolgozása vagy más módon csak egy bizonyos megfigyeléshez szükséges adatok hiánya miatt fordulnak elő.
Ebben a bájtban megnézzük, hogyan lehet NaN-eket kitölteni a
DataFrame
, ha úgy dönt, hogy a NaN-eket kitöltésével kezeli.
Először is hozzunk létre egy modellt DataFrame
néhány véletlenszerű érték kiesésével:
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
Ábrázoljuk mondjuk a harmadik oszlopot:
plt.plot(df['Col3'])
Különféle technikákkal kitöltve ez a NaN-nel töltött grafikon helyettesíthető a következővel:
fillna() – Átlag, Medián, Mód
Ezeket az értékeket kitöltheti egy új oszlopba, és hozzárendelheti a kitölteni kívánt oszlophoz, vagy helyben a segítségével inplace
érv. Itt a kitöltött értékeket egy új oszlopban bontjuk ki az ellenőrzés megkönnyítése érdekében:
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)
Az oszlop mediánja, átlaga és módusa: -0.187669
, -0.110873
és a 0.000000
és ezeket az értékeket minden egyes NaN esetében alkalmazzuk. Ez gyakorlatilag állandó értékekkel tölti fel, ahol a bevitt érték az oszlop bejegyzésétől függ.
Először is, a medián értékekkel való kitöltése a következőket eredményezi:
Átlagos értékekkel:
Módértékekkel:
fillna() – Állandó érték
Ehelyett állandó értékkel is kitöltheti:
Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!
constant = df['Col3'].fillna(0, inplace=False
Ez azt eredményezi, hogy minden NaN helyett egy állandó értéket (0) adunk meg. 0
közel van a mediánunkhoz és az átlagunkhoz, és egyenlő a módussal, így a kitöltött értékek nagyon hasonlítanak ehhez a módszerhez az áladatkészletünk esetében:
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() – Előre és hátrafelé történő kitöltés
Minden sorban végezhet előre vagy hátra kitöltést, az értéket az előtti vagy utáni sorból veheti át:
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
Előre kitöltéssel, mivel a 2. sorból hiányozunk – az 1. sor értékét veszik a második sor kitöltésére. Az értékek előre terjednek:
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
A visszafelé történő kitöltéssel az ellenkezője történik. A 2. sor a 3. sor értékével van kitöltve:
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
Bár ha több is van NaN
sorozatban – ezek nem működnek jól, és a NaN-eket lejjebb kaszkádozhatják, elferdítve az adatokat és eltávolítva a ténylegesen rögzített értékeket.
interpolál()
A interpolate()
módszer az értékek interpolációját a SciPy-re delegálja módszerek sorozata az értékek interpolálására. Sokféle érvet elfogad, többek között nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
Stb
Az interpoláció sokkal rugalmasabb és „okosabb”, mint az értékek konstansokkal vagy félváltozókkal való kitöltése, mint például a korábbi módszerek.
Az interpoláció olyan módon tudja megfelelően kitölteni a sorozatot, ahogy azt semmilyen más módszer nem tudja, például:
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
Az alapértelmezett interpoláció lineáris, és ezt feltételezve 1...5
valószínű a 1, 2, 3, 4, 5
a sorozat nem távoli (de nem garantált). Mind az állandó kitöltés, mind az előre vagy hátrafelé történő kitöltés itt csúnyán kudarcot vall. Általánosságban elmondható, hogy az interpoláció általában jó barát, ha zajos jelekben vagy sérült adatkészletekben NaN-eket kell kitölteni.
Az interpolációs típusokkal való kísérletezés jobb eredményeket hozhat.
Itt van két interpolációs módszer (splice
és a polynomial
igényelnek egy order
érv):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
Ezek a következőket eredményezik:
És: