web-dev-qa-db-de.com

Das Argument TypeError: float () muss eine Zeichenfolge oder eine Zahl sein, nicht 'function' - Python/Sklearn

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:

TypeError: float () - Argument muss eine Zeichenfolge oder eine Zahl sein, nicht 'method' in Geocoder

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. 

5
HMLDude

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 NaNs 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
2
coldspeed
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

0
Mark Whitfield

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

0
sol