Ich habe den folgenden Code-Ausschnitt aus einem Programm namens Flights.py
...
#Load the Dataset
df = dataset
df.isnull().any()
df = df.fillna(lambda x: x.median())
# Define X and Y
X = df.iloc[:, 2:124].values
y = df.iloc[:, 136].values
X_tolist = X.tolist()
# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
Die vorletzte Zeile löst den folgenden Fehler aus:
Traceback (most recent call last):
File "<ipython-input-14-d4add2ccf5ab>", line 3, in <module>
X_train = sc.fit_transform(X_train)
File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/base.py", line 494, in fit_transform
return self.fit(X, **fit_params).transform(X)
File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 560, in fit
return self.partial_fit(X, y)
File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/preprocessing/data.py", line 583, in partial_fit
estimator=self, dtype=FLOAT_DTYPES)
File "/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/utils/validation.py", line 382, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
TypeError: float() argument must be a string or a number, not 'function'
Mein Datenrahmen df
hat die Größe (22587, 138)
Ich habe mir die folgende Frage zur Inspiration angesehen:
Ich habe folgende Einstellung ausprobiert:
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train.as_matrix)
X_test = sc.transform(X_test.as_matrix)
Was zu folgendem Fehler geführt hat:
AttributeError: 'numpy.ndarray' object has no attribute 'as_matrix'
Ich bin momentan unzufrieden damit, wie ich durch den Datenrahmen scannen und die fehlerhaften Einträge finden/konvertieren kann.
Wie diese Antwort erklärt, ist fillna
nicht dafür ausgelegt, mit einem Rückruf zu arbeiten. Wenn Sie einen Wert übergeben, wird dieser als Literal-Füllwert verwendet. Das bedeutet, dass Ihre NaN
s durch Lambdas ersetzt wird:
df
col1 col2 col3 col4
row1 65.0 24 47.0 NaN
row2 33.0 48 NaN 89.0
row3 NaN 34 67.0 NaN
row4 24.0 12 52.0 17.0
df4.fillna(lambda x: x.median())
col1 col2 \
row1 65 24
row2 33 48
row3 <function <lambda> at 0x10bc47730> 34
row4 24 12
col3 col4
row1 47 <function <lambda> at 0x10bc47730>
row2 <function <lambda> at 0x10bc47730> 89
row3 67 <function <lambda> at 0x10bc47730>
row4 52 17
Wenn Sie versuchen, einen Medianwert einzugeben, besteht die Lösung darin, einen Datenrahmen aus Medianwerten basierend auf der Spalte zu erstellen und diesen an fillna
zu übergeben.
df
col1 col2 col3 col4
row1 65.0 24 47.0 NaN
row2 33.0 48 NaN 89.0
row3 NaN 34 67.0 NaN
row4 24.0 12 52.0 17.0
df.fillna(df.median())
df
col1 col2 col3 col4
row1 65.0 24 47.0 53.0
row2 33.0 48 52.0 89.0
row3 33.0 34 67.0 53.0
row4 24.0 12 52.0 17.0
df = df.fillna(lambda x: x.median())
Dies ist keine wirklich gültige Methode für die Verwendung von fillna
. Hier werden Literalwerte oder eine Zuordnung von Spalten- zu Literalwerten erwartet. Die von Ihnen bereitgestellte Funktion wird nicht angewendet. Stattdessen wird der Wert von NA-Zellen einfach auf die Funktion selbst gesetzt. Dies ist die Funktion, die Ihr Schätzer versucht, in einen Float zu werden.
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
Ich hatte die gleichen Probleme mit df = df.fillna(lambda x: x.median())
Hier ist meine Lösung, um wahre Werte anstelle von 'function' in Dataframe zu bekommen:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
Ich erstelle Datenrahmen 10 Zeilen, 3 Kolonnen mit Nan
df = pd.DataFrame(np.random.randint(100,size=(10,3)))
df.iloc[3:5,0] = np.nan
df.iloc[4:6,1] = np.nan
df.iloc[5:8,2] = np.nan
Attributieren Sie nachträglich dumme Spaltenbeschriftungen
df.columns=['Number_of_Holy_Hand_Grenades_of_Antioch', 'Number_of_knight_fleeings', 'Number_of_rabbits_of_Caerbannog']
print df.isnull().any() # tell if nan per column
Für jede Spalte durch ihre Beschriftungen füllen wir alle nan-Werte nach dem Mittelwert, der für die Spalte selbst berechnet wurde. Kann mit mean () usw. verwendet werden.
for i in df.columns: #df.columns[w:] if you have w column of line description
df[i] = df[i].fillna(df[i].median() )
print df.isnull().any()
Jetzt enthält df nan durch Medianwert ersetzt
print df
sie können zum Beispiel tun
X = df.ix[:,:].values
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
was mit df = df.fillna(lambda x: x.median())
.__ nicht funktioniert. Wir können jetzt df in forward-Methode verwenden, da alle Werte wahre Werte sind und keine Funktion. im Gegensatz zu der Methode, die Lambda in dataframe.fillna () verwendet, wie z. B. alle Vorschläge, bei denen Fillna zu Lambda kombiniert wird