J'ai l'extrait de code suivant d'un programme appelé 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)
L'avant-dernière ligne génère l'erreur suivante:
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'
Ma base de données df
est de taille (22587, 138)
Je cherchais de l'inspiration à la question suivante:
TypeError: l'argument float () doit être une chaîne ou un nombre, et non pas "méthode" dans Geocoder
J'ai essayé l'ajustement suivant:
# 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)
Ce qui a entraîné l'erreur suivante:
AttributeError: 'numpy.ndarray' object has no attribute 'as_matrix'
Je ne sais pas comment analyser l'ensemble de données et rechercher/convertir les entrées incriminées.
Comme cette réponse explique, fillna
n'est pas conçu pour fonctionner avec un rappel. Si vous en passez une, elle sera considérée comme la valeur de remplissage littérale, ce qui signifie que votre NaN
s sera remplacé par lambdas:
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
Si vous essayez de remplir par médiane, la solution serait de créer une trame de données de médian basée sur la colonne et de la transmettre à fillna
.
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())
Ce n'est pas vraiment un moyen valide d'utiliser fillna
. Il attend ici des valeurs littérales ou un mappage de valeurs de colonne à littérales. Cela n’appliquera pas la fonction que vous avez fournie; au lieu de cela, la valeur des cellules NA sera simplement définie sur la fonction elle-même. C’est la fonction que votre estimateur tente de transformer en float.
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
J'ai eu les mêmes problèmes en utilisant df = df.fillna(lambda x: x.median())
Voici ma solution pour obtenir de vraies valeurs plutôt que 'fonction' dans le cadre de données:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
Je crée une base de données 10 lignes, 3 colonnes avec 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
Attribuer des étiquettes de colonne stupides pour plus de commodité par la suite
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
Pour chaque colonne à travers leurs étiquettes, nous remplissons toute la valeur nan par la valeur médiane calculée sur la colonne elle-même. Peut être utilisé avec mean (), etc.
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()
Maintenant df contient nan remplacé par valeur médiane
print df
tu peux faire par exemple
X = df.ix[:,:].values
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
qui ne fonctionne pas avec df = df.fillna(lambda x: x.median())
Nous pouvons maintenant utiliser df dans la méthode forward car toutes les valeurs sont des valeurs vraies, pas une fonction; contrairement à la méthode utilisant lambda dans dataframe.fillna () comme par exemple, toutes les propositions utilisant fillna combinées à lambda