wake-up-neo.net

pandas DataFrame: Ersetzen Sie nan-Werte durch den Mittelwert der Spalten

Ich habe einen Pandas-DataFrame, der hauptsächlich mit reellen Zahlen gefüllt ist, aber es gibt auch ein paar nan-Werte.

Wie kann ich die nans durch die Durchschnittswerte der Spalten ersetzen, wo sie sind?

Diese Frage ist dieser Frage sehr ähnlich: numpy array: Ersetzen der nan-Werte durch den Mittelwert der Spalten , leider funktioniert die dort angegebene Lösung nicht für einen Pandas-DataFrame.

95
piokuc

Sie können einfach DataFrame.fillna verwenden, um die nan direkt zu füllen:

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

Der Docstring von fillna besagt, dass value ein Skalar oder ein Diktat sein sollte, es scheint jedoch auch mit einer Series zu funktionieren. Wenn Sie ein Diktat übergeben möchten, können Sie df.mean().to_dict() verwenden.

172
bmu

Versuchen:

sub2['income'].fillna((sub2['income'].mean()), inplace=True)
31
Ammar Shigri
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

Übernehmen Sie pro Spalte den Mittelwert dieser Spalten und füllen Sie sie aus

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
17
Jeff
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

# To divide input in X and y axis
X = Dataset.iloc[:, :-1].values
Y = Dataset.iloc[:, 3].values

# To calculate mean use imputer class

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)


 imputer = imputer.fit(X[:, 1:3])
    X[:, 1:3] = imputer.transform(X[:, 1:3])
8
Roshan jha

Wenn Sie fehlende Werte mit dem Mittelwert angeben und Spalte für Spalte verwenden möchten, wird dies nur mit dem Mittelwert dieser Spalte angezeigt. Dies könnte etwas lesbarer sein.

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
7
Pranay Aryal

Eine andere Option als die oben genannten ist:

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

Es ist weniger elegant als die vorherigen Antworten für den Mittelwert, aber es könnte kürzer sein, wenn Sie NULL-Werte durch andere Spaltenfunktionen ersetzen möchten.

4
guibor

Verwenden Sie direkt df.fillna(df.mean()), um den gesamten Nullwert mit dem Mittelwert zu füllen

Wenn Sie einen Nullwert mit dem Mittelwert dieser Spalte füllen möchten, können Sie diesen verwenden

angenommen, x=df['Item_Weight'] ist hier Item_Weight der Name der Spalte

hier werden wir zuweisen (Nullwerte von x mit dem Mittelwert von x in x einfüllen)

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

Wenn Sie einen Nullwert mit einer Zeichenfolge füllen möchten, verwenden Sie 

hier ist Outlet_size der Name der Spalte 

df.Outlet_Size = df.Outlet_Size.fillna('Missing')
4
Sunny Barnwal

Pandas: Wie werden NaN-Werte durch den Durchschnitt (Mittelwert), den Median oder eine andere Statistik einer Spalte ersetzt?

Angenommen, Ihr DataFrame ist df und Sie haben eine Spalte mit dem Namen nr_items. Dies ist: df['nr_items']

Wenn Sie ersetzen die NaN -Werte Ihrer Spalte df['nr_items'] mit Mittelwert der Spalte:

Verwenden Sie die Methode .fillna:

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

Ich habe eine neue df-Spalte mit dem Namen nr_item_ave erstellt, um die neue Spalte zu speichern, wobei die NaN-Werte durch den mean-Wert der Spalte ersetzt werden.

Sie sollten vorsichtig sein, wenn Sie die mean verwenden. Wenn Sie über Ausreißerverfügen, _ ist es empfehlenswert, die median zu verwenden.

0
pink.slash