pandas DataFrame: nan değerlerini ortalama sütunlarla değiştir


Yanıtlar:


273

Doğrudan 's DataFrame.fillnadoldurmak için kullanabilirsiniz nan:

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean())
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

Doktorası bunun bir skaler veya bir diksiyon olması gerektiğini fillnasöylüyor value, ancak Seriesaynı zamanda bir ile de çalışıyor gibi görünüyor . Eğer bir karar vermek istiyorsanız, kullanabilirsiniz df.mean().to_dict().


10
df.fillna(df.mean())yeni veri çerçevesini döndürür, bu nedenle df=df.fillna(df.mean())onu tutmak için yazmanız gerekir.
yannis

bunu kullanarak ortalama için neden yanlış miktarda empoze olabilir herhangi bir fikir?
bernando_vialli

25
Bunun yerine df=df.fillna(df.mean())kullanabilirsinizdf.fillna(df.mean(), inplace=True)
Anderson Pimentel

20
Eğer Makine Öğrenimi / Veri Bilim bu kullanmak istiyorsanız: DİKKAT Veri Bilim bakış açısıyla öyle yanlış ilk NA yerini ve ardından tren ve teste bölmek ... Sen tren ve teste ilk bölünmüş, o zamana kadar NA yerine GEREKİR trende ortalama ve daha sonra test etmek için bu durumlu önişleme modelini uygulayın, aşağıdaki sklearn ile ilgili cevaba bakınız!
Fabian Werner

2
@ amalik2205 çünkü aksi takdirde test setinden eğitim setine bilgi sızdırıyorsunuz! Şöyle düşünün: 100 veri satırımız var ve x sütununu dikkate alıyoruz. X'in ilk 99 girişi NA'dır. Test seti olarak 100. satırı ayırmak istiyoruz. Diyelim ki satır 100, x sütununda 20 değerine sahip. Daha sonra, x sütunundaki eğitim setindeki tüm girişleri, test setinden% 100 gelen bir değer olan 20 ile değiştireceksiniz. Bu nedenle, değerlendirme sizi kandırabilir!
Fabian Werner


28
In [16]: df = DataFrame(np.random.randn(10,3))

In [17]: df.iloc[3:5,0] = np.nan

In [18]: df.iloc[4:6,1] = np.nan

In [19]: df.iloc[5:8,2] = np.nan

In [20]: df
Out[20]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3       NaN -0.985188 -0.324136
4       NaN       NaN  0.238512
5  0.769657       NaN       NaN
6  0.141951  0.326064       NaN
7 -1.694475 -0.523440       NaN
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

In [22]: df.mean()
Out[22]: 
0   -0.251534
1   -0.040622
2   -0.841219
dtype: float64

Sütun başına bu sütunların ortalamasını uygulayın ve doldurun

In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622  0.238512
5  0.769657 -0.040622 -0.841219
6  0.141951  0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

5
Neden bilmiyorum, ama df.fillna (df.mean ()) işe yaramadı, sadece sürümünüz geçerlidir. Python 3
Rocketq

12
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])

Tüm bunların çok daha basit alternatiflere göre avantajı nedir?
AMC

@Roshan Jha Mantığı açıklamak her zaman daha iyidir. Aynı görevi R & Python'da yapmanın birçok yolu vardır. Ancak, farklı bir şey öneriyorsanız, bunu yapmanın bazı avantajlarını belirtmek isteyebilirsiniz
Dr Nisha Arora

10

Eksik değerleri ortalama ile çarpıştırmak ve sütun sütun gitmek istiyorsanız, bu yalnızca o sütunun ortalamasını etkiler. Bu biraz daha okunabilir olabilir.

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))

3
Lütfen bunun sorunu nasıl çözdüğüne ilişkin biraz açıklama yapın.
Gurwinder Singh

10

df.fillna(df.mean())Tüm boş değerleri ortalama ile doldurmak için doğrudan kullanın

Boş değeri bu sütunun ortalamasıyla doldurmak istiyorsanız bunu kullanabilirsiniz

varsayalım x=df['Item_Weight']burada Item_Weightsütun adıdır

burada ataıyoruz (x'in null değerlerini x'in ortalaması ile x'e doldurun)

df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))

Boş bir değeri dize ile doldurmak istiyorsanız şunu kullanın:

işte Outlet_sizesütun adı

df.Outlet_Size = df.Outlet_Size.fillna('Missing')

9

Yukarıdakilerin yanı sıra başka bir seçenek:

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

Önceki yanıtlardan daha az zariftir, ancak null'ları başka bir sütun işleviyle değiştirmek isterseniz daha kısa olabilir.


7

Pandalar: NaN ( nan) değerlerini bir sütunun ortalama (ortalama), medyan veya diğer istatistikleriyle değiştirme

DataFrame'inizin olduğunu dfve adlı bir sütunun olduğunu söyle nr_items. Bu: df['nr_items']

İsterseniz yerineNaN sütununuzun değerlerini df['nr_items']ile sütunun ortalama :

Yöntemi kullanın .fillna():

mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)

Ben yeni sütunu değerleri sütun değeri ile değiştirilen depolamak için dfadlandırılan yeni bir sütun oluşturduk .nr_item_aveNaNmean

mean. Kullanırken dikkatli olmalısınız . Aykırı değerleriniz varsa ,median


0

sklearn kütüphane önişleme sınıfını kullanma

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

Not: yeni sürümü parametre olarak missing_valuesdeğer değişikliği np.nangelenNaN

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.