preprocessing - python get_dummies example
Pandas OneHotEncoder.fit(dataframe) devuelve ValueError: literal inválido para long() con base 10 (2)
Su error aquí es que está llamando a OneHotEncoder que de los documentos
La entrada a este transformador debe ser una matriz de enteros
pero tu df tiene una sola columna ''cat1'' que es de un object
dtype que en realidad es una Cadena.
Deberías usar LabelEcnoder :
In [13]:
le = preprocessing.LabelEncoder()
le.fit(df.dropna().values)
le.classes_
C:/WinPython-64bit-3.3.3.2/python-3.3.3.amd64/lib/site-packages/sklearn/preprocessing/label.py:108: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
y = column_or_1d(y, warn=True)
Out[13]:
array([''Reescribe-medios-clases-online'', ''eventos'', ''grados'', ''latam'',
''postgrados''], dtype=object)
Tenga en cuenta que tuve que soltar la fila NaN
ya que esto introducirá un tipo mixto que no se puede usar para ordenar, por ejemplo, float> str no funcionará
Intento convertir un dataframe de Pandas en una matriz NumPy para crear un modelo con Sklearn. Simplificaré el problema aquí.
>>> mydf.head(10)
IdVisita
445 latam
446 NaN
447 grados
448 grados
449 eventos
450 eventos
451 Reescribe-medios-clases-online
454 postgrados
455 postgrados
456 postgrados
Name: cat1, dtype: object
>>> from sklearn import preprocessing
>>> enc = preprocessing.OneHotEncoder()
>>> enc.fit(mydf)
Rastrear:
ValueError Traceback (most recent call last)
<ipython-input-74-f581ab15cbed> in <module>()
2 mydf.head(10)
3 enc = preprocessing.OneHotEncoder()
----> 4 enc.fit(mydf)
/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in fit(self, X, y)
996 self
997 """
--> 998 self.fit_transform(X)
999 return self
1000
/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in fit_transform(self, X, y)
1052 """
1053 return _transform_selected(X, self._fit_transform,
-> 1054 self.categorical_features, copy=True)
1055
1056 def _transform(self, X):
/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in _transform_selected(X, transform, selected, copy)
870 """
871 if selected == "all":
--> 872 return transform(X)
873
874 X = atleast2d_or_csc(X, copy=copy)
/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in _fit_transform(self, X)
1001 def _fit_transform(self, X):
1002 """Assumes X contains only categorical features."""
-> 1003 X = check_arrays(X, sparse_format=''dense'', dtype=np.int)[0]
1004 if np.any(X < 0):
1005 raise ValueError("X needs to contain only non-negative integers.")
/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/sklearn/utils/validation.pyc in check_arrays(*arrays, **options)
279 array = np.ascontiguousarray(array, dtype=dtype)
280 else:
--> 281 array = np.asarray(array, dtype=dtype)
282 if not allow_nans:
283 _assert_all_finite(array)
/home/dukebody/Apps/Anaconda/lib/python2.7/site-packages/numpy/core/numeric.pyc in asarray(a, dtype, order)
460
461 """
--> 462 return array(a, dtype, copy=False, order=order)
463
464 def asanyarray(a, dtype=None, order=None):
ValueError: invalid literal for long() with base 10: ''postgrados''
Aviso IdVisita
es el índice aquí y los números pueden no ser todos consecutivos.
¿Alguna pista?
Un enfoque más simple es usar DictVectorizer , que hace la conversión a un entero así como a OneHotEncoding en el mismo paso.
Usarlo con el argumento DictVectorizer(sparse=False)
permite obtener un DataFrame
después de la fit_transform
para seguir trabajando con Pandas.