pandas DataFrame: Ersetzen Sie die Nanowerte durch den Durchschnitt der Spalten


177

Ich habe einen Pandas DataFrame, der hauptsächlich mit reellen Zahlen gefüllt ist, aber es gibt auch einige nanWerte.

Wie kann ich das nans durch Durchschnittswerte der Spalten ersetzen, in denen sie sich befinden?

Diese Frage ist der folgenden sehr ähnlich: numpy array: Ersetzen Sie die Nanowerte durch den Durchschnitt der Spalten, aber leider funktioniert die dort angegebene Lösung für einen Pandas-DataFrame nicht.

Antworten:


273

Sie können einfach verwenden DataFrame.fillna, um die nan's 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

Die Dokumentation von fillnasagt, dass valuedies ein Skalar oder ein Diktat sein sollte, aber es scheint auch mit einem zu funktionieren Series. Wenn Sie ein Diktat verabschieden möchten, können Sie verwenden df.mean().to_dict().


10
df.fillna(df.mean())gibt den neuen Datenrahmen zurück, sodass Sie schreiben müssen df=df.fillna(df.mean()), um ihn zu behalten.
Yannis

Irgendwelche Ideen, warum ich damit den falschen Betrag für den Mittelwert unterstellen könnte?
Bernando_vialli

25
Anstelle von df=df.fillna(df.mean())Ihnen könnte auchdf.fillna(df.mean(), inplace=True)
Anderson Pimentel

19
VORSICHT: Wenn Sie dies für maschinelles Lernen / Data Science verwenden möchten: Aus Data Science-Sicht ist es falsch , zuerst NA zu ersetzen und dann in Zug und Test aufzuteilen ... Sie MÜSSEN zuerst in Zug und Test aufteilen und dann NA durch ersetzen meine im Zug und wende dann dieses zustandsbehaftete Vorverarbeitungsmodell zum Testen an, siehe die Antwort mit sklearn unten!
Fabian Werner

1
@ amalik2205, da sonst Informationen aus dem Testsatz in den Trainingssatz gelangen! Stellen Sie sich das so vor: Wir haben 100 Datenzeilen und betrachten Spalte x. Die ersten 99 Einträge von x sind NA. Wir wollen Zeile 100 als Testsatz abspalten. Nehmen wir an, Zeile 100 hat in Spalte x den Wert 20. Anschließend ersetzen Sie alle Einträge im Trainingssatz in Spalte x durch 20, wobei der Wert zu 100% aus dem Testsatz stammt. Daher könnte die Bewertung Sie täuschen!
Fabian Werner

51

Versuchen:

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

27
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

Wenden Sie pro Spalte den Mittelwert dieser Spalten an und füllen Sie

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

4
Ich weiß nicht warum, aber df.fillna (df.mean ()) hat nicht funktioniert, nur Ihre Version mit Apply. 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])

Was ist der Vorteil von all dem gegenüber den weitaus einfacheren Alternativen?
AMC

@ Roshan Jha Es ist immer besser, die Logik zu erklären. Es gibt viele Möglichkeiten, dieselbe Aufgabe in R & Python auszuführen. Wenn Sie jedoch etwas anderes vorschlagen, möchten Sie vielleicht auf einige Vorteile hinweisen
Dr. Nisha Arora

10

Wenn Sie fehlende Werte mit dem Mittelwert unterstellen möchten und Spalte für Spalte gehen möchten, wird dies nur mit dem Mittelwert dieser Spalte unterstellt. Dies könnte etwas besser lesbar sein.

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

3
Bitte erläutern Sie, wie das Problem dadurch gelöst wird.
Gurwinder Singh

10

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

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

Angenommen, x=df['Item_Weight']hier Item_Weightist der Spaltenname

hier weisen wir zu (füllen Sie Nullwerte von x mit dem Mittelwert von x in x)

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

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

Hier Outlet_sizeist der Spaltenname

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

9

Eine andere Option neben den 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 Nullen durch eine andere Spaltenfunktion ersetzen möchten.


7

Pandas: So ersetzen Sie NaN ( nan) -Werte durch Durchschnitts-, Mittelwert- oder andere Statistiken einer Spalte

Angenommen, Ihr DataFrame ist dfund Sie haben eine Spalte aufgerufen nr_items. Das ist: df['nr_items']

Wenn Sie die Werte Ihrer Spalte durch den Mittelwert der Spalte ersetzen möchten :NaNdf['nr_items']

Methode verwenden .fillna():

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

Ich habe eine neue dfSpalte erstellt, die aufgerufen wird nr_item_ave, um die neue Spalte zu speichern, wobei die NaNWerte durch den meanWert der Spalte ersetzt werden.

Sie sollten vorsichtig sein, wenn Sie das verwenden mean. Wenn Sie Ausreißer haben, ist es empfehlenswerter, die zu verwendenmedian


0

Verwenden der Vorverarbeitungsklasse der sklearn-Bibliothek

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

Hinweis: In der letzten Version missing_valuesändern Sie den Parameterwert np.nanvonNaN

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.