Panda DataFrame: sostituisce i valori nan con la media delle colonne


Risposte:


273

Puoi semplicemente usare DataFrame.fillnaper riempire nandirettamente il:

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

La dottrina di fillnadice che valuedovrebbe essere uno scalare o un dettato, tuttavia, sembra funzionare anche con un Series. Se vuoi superare un dict, puoi usare df.mean().to_dict().


10
df.fillna(df.mean())restituirà il nuovo frame di dati, quindi dovrai scrivere df=df.fillna(df.mean())per conservarlo.
yannis,

qualche idea sul perché potrei ottenere la quantità sbagliata imputata per la media usando questo?
bernando_vialli,

25
Invece di df=df.fillna(df.mean())te potresti usare anchedf.fillna(df.mean(), inplace=True)
Anderson Pimentel il

20
ATTENZIONE: se si desidera utilizzarlo per Machine Learning / Data Science: dal punto di vista della scienza dei dati è errato sostituire prima NA e poi dividerlo in treno e test ... DEVE prima dividere in treno e test, quindi sostituire NA significa sul treno e quindi applicare questo modello di pre-elaborazione con stato per testare, vedere la risposta che coinvolge sklearn di seguito!
Fabian Werner,

2
@ amalik2205 perché altrimenti perdi informazioni dal set di test al set di allenamento! Immaginalo in questo modo: abbiamo 100 righe di dati e consideriamo la colonna x. Le prime 99 voci di x sono NA. Vogliamo dividere la riga 100 come set di test. Supponiamo che la riga 100 abbia valore 20 nella colonna x. Quindi sostituirai tutte le voci nel set di allenamento nella colonna x con 20, un valore proveniente al 100% dal set di test. Quindi, la valutazione potrebbe ingannarti!
Fabian Werner,

51

Provare:

sub2['income'].fillna((sub2['income'].mean()), inplace=True)

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

Applica per colonna la media di tali colonne e riempi

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
Non so perché, ma df.fillna (df.mean ()) non ha funzionato, solo la tua versione con applica. 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])

Qual è il vantaggio di tutto ciò rispetto alle alternative molto più semplici?
AMC

@Roshan Jha È sempre meglio spiegare la logica. Esistono molti modi per eseguire la stessa attività in R & Python. Tuttavia, se stai suggerendo qualcosa di diverso, potresti voler evidenziare alcuni vantaggi di farlo
Dr Nisha Arora,

10

Se si desidera imputare i valori mancanti con la media e si desidera passare colonna per colonna, questo verrà imputato solo con la media di quella colonna. Questo potrebbe essere un po 'più leggibile.

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

3
Fornisci una spiegazione di come questo risolve il problema.
Gurwinder Singh,

10

Utilizzare direttamente df.fillna(df.mean())per riempire tutto il valore null con media

Se vuoi riempire il valore null con la media di quella colonna, puoi usarlo

supponiamo che x=df['Item_Weight']qui Item_Weightsia il nome della colonna

qui stiamo assegnando (riempire i valori null di x con la media di x in x)

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

Se vuoi riempire il valore null con qualche stringa, allora usa

ecco il Outlet_sizenome della colonna

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

9

Un'altra opzione oltre a quelle sopra è:

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

In media è meno elegante delle risposte precedenti, ma potrebbe essere più breve se si desidera sostituire i null con un'altra funzione di colonna.


7

Panda: come sostituire i nanvalori NaN ( ) con la media (media), mediana o altre statistiche di una colonna

Supponiamo che il tuo DataFrame sia dfe hai una colonna chiamata nr_items. Questo è: df['nr_items']

Se vuoi sostituire i NaNvalori della tua colonna df['nr_items']con la media della colonna :

Utilizzare il metodo .fillna():

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

Ho creato una nuova dfcolonna chiamata nr_item_aveper memorizzare la nuova colonna con i NaNvalori sostituiti dal meanvalore della colonna.

Dovresti stare attento quando usi il mean. Se si dispone di valori anomali è più consigliabile utilizzare ilmedian


0

utilizzando la classe di preelaborazione della libreria sklearn

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])

Nota: nella versione recente il missing_valuesvalore del parametro cambia in np.nandaNaN

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.