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.