Eksik değerler yaygındır ve insan hatası, alet hatası, başka bir ekipten işleme veya belirli bir gözlem için veri eksikliği nedeniyle oluşur.
Bu Bayt'ta, NaN'lerin nasıl doldurulacağına bir göz atacağız.
DataFrame
, NaN'leri doldurarak işlemeyi seçerseniz.
İlk önce, bir sahte oluşturalım DataFrame
bazı rastgele değerler düştü:
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
Diyelim ki üçüncü sütunu çizelim:
plt.plot(df['Col3'])
Çeşitli tekniklerle doldurulduğunda – bu NaN dolgulu grafik aşağıdakilerle değiştirilebilir:
fillna() – Ortalama, Medyan, Mod
Bu değerleri yeni bir sütuna doldurabilir ve doldurmak istediğiniz sütuna veya yerinde atayabilirsiniz. inplace
argüman. Burada, inceleme kolaylığı için doldurulan değerleri yeni bir sütuna çıkaracağız:
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)
Sütunun medyanı, ortalaması ve modu -0.187669
, -0.110873
ve 0.000000
ve bu değerler sırasıyla her NaN için kullanılacaktır. Bu, girilen değerin sütunun içeriğine bağlı olduğu sabit değerlerle etkin bir şekilde doldurulur.
İlk olarak, medyan değerlerle doldurmak şu sonuçları verir:
Ortalama değerlerle:
Mod değerleriyle:
fillna() – Sabit Değer
Bunun yerine sabit bir değerle de doldurabilirsiniz:
En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!
constant = df['Col3'].fillna(0, inplace=False
Bu, her NaN yerine sabit bir değerin (0) konmasına neden olur. 0
medyanımıza yakın ve ortalama ve moda eşit, bu nedenle doldurulan değerler, sahte veri kümemiz için bu yönteme çok benzeyecektir:
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() – İleri ve Geri Doldurma
Her satırda - önceki veya sonraki satırdan değeri alarak ileri veya geri doldurma yapabilirsiniz:
ffill = df['Col3'].fillna(method='ffill')
bfill = df['Col3'].fillna(method='bfill')
İleri doldurmada, 2. satırda eksik olduğumuz için – ikinci satırı doldurmak için 1. satırdaki değer alınır. Değerler ileriye doğru yayılır:
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
Geri doldurmada ise tam tersi olur. Satır 2, satır 3'teki değerle doldurulur.
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
Yine de, birden fazla varsa NaN
sırayla – bunlar iyi sonuç vermez ve NaN'leri daha da aşağı kademelendirebilir, verileri çarpıtabilir ve gerçekte kaydedilen değerleri kaldırabilir.
enterpolasyon()
The interpolate()
yöntem, değerlerin enterpolasyonunu SciPy's'e devreder değerleri enterpolasyon için yöntemler paketi. Aşağıdakiler de dahil olmak üzere çok çeşitli argümanları kabul eder: nearest
, zero
, slinear
, quadratic
, cubic
, spline
, barycentric
, polynomial
, krogh
, piecewise_polynomial
, spline
, pchip
, akima
, cubicspline
, vb.
İnterpolasyon, önceki yöntemler gibi değerleri sabitler veya yarı değişkenlerle doldurmaktan çok daha esnek ve “akıllı”dır.
Enterpolasyon, bir diziyi başka hiçbir yöntemin yapamayacağı şekilde düzgün bir şekilde doldurabilir, örneğin:
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
Varsayılan enterpolasyon doğrusaldır ve 1...5
muhtemelen bir 1, 2, 3, 4, 5
dizi çok uzak değil (ancak garanti edilmiyor). Hem sürekli doldurma hem de ileri veya geri doldurma burada sefil bir şekilde başarısız olur. Genel olarak konuşursak - NaN'leri gürültülü sinyallerle veya bozuk veri kümeleriyle doldurmak söz konusu olduğunda enterpolasyon genellikle iyi bir arkadaş olacaktır.
İnterpolasyon türleri ile denemeler yapmak daha iyi sonuçlar verebilir.
İşte iki enterpolasyon yöntemi (splice
ve polynomial
bir order
argüman):
nearest = df['Col3'].interpolate(method='nearest')
polynomial = df['Col3'].interpolate(method='polynomial', order=3)
Bunlar şunlarla sonuçlanır:
Ve: