ValueError: не удалось преобразовать строку в число с плавающей точкой: '���' - PullRequest
1 голос
/ 19 марта 2019

У меня есть (2M, 23) размерный numpy массив X.Он имеет тип d <U26, то есть строку Unicode из 26 символов.

array([['143347', '1325', '28.19148936', ..., '61', '0', '0'],
   ['50905', '0', '0', ..., '110', '0', '0'],
   ['143899', '1325', '28.80434783', ..., '61', '0', '0'],
   ...,
   ['85', '0', '0', ..., '1980', '0', '0'],
   ['233', '54', '27', ..., '-1', '0', '0'],
   ['���', '�', '�����', ..., '�', '��', '���']], dtype='<U26')

Когда я конвертирую его в тип данных с плавающей запятой, используя

X_f = X.astype(float)

, я получаю ошибку, как показано выше.Я пытаюсь найти, как решить эту ошибку форматирования строки для '���'.

Что это значит (как это называется?) И как мне решить эту ошибку?

РЕДАКТИРОВАТЬ: Информация о том, как данные были прочитаны: -

импорт соответствующих пакетов

from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.functions import col

загрузка набора данных в фрейм данных pyspark

def loading_data(dataset):
    dataset=sql_sc.read.format('csv').options(header='true', inferSchema='true').load(dataset)
    # #changing column header name
    dataset = dataset.select(*[col(s).alias('Label') if s == ' Label' else s for s in dataset.columns])
    #to change datatype
    dataset=dataset.drop('External IP')
    dataset = dataset.filter(dataset.Label.isNotNull())
    dataset=dataset.filter(dataset.Label!=' Label')#filter Label from label
    print(dataset.groupBy('Label').count().collect())
    return dataset

# invoking
ds_path = '../final.csv'
dataset=loading_data(ds_path)

проверка типа набора данных.

type(dataset)

pyspark.sql.dataframe.DataFrame

преобразовать в массив np

import numpy as np
np_dfr = np.array(data_preprocessing(dataset).collect())

разделить элементы и метки

X = np_dfr[:,0:22]
Y = np_dfr[:,-1]

показать X

>> X
array([['143347', '1325', '28.19148936', ..., '61', '0', '0'],
       ['50905', '0', '0', ..., '110', '0', '0'],
       ['143899', '1325', '28.80434783', ..., '61', '0', '0'],
       ...,
       ['85', '0', '0', ..., '1980', '0', '0'],
       ['233', '54', '27', ..., '-1', '0', '0'],
       ['���', '�', '�����', ..., '�', '��', '���']], dtype='<U26')

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Хотя это и не лучшее решение, я нашел некоторый успех, преобразовав его в pandas dataframe и работая вместе.

фрагмент кода

# convert X into dataframe
X_pd = pd.DataFrame(data=X)
# replace all instances of URC with 0 
X_replace = X_pd.replace('�',0, regex=True)
# convert it back to numpy array
X_np = X_replace.values
# set the object type as float
X_fa = X_np.astype(float)

input

array([['85', '0', '0', '1980', '0', '0'],
       ['233', '54', '27', '-1', '0', '0'],
       ['���', '�', '�����', '�', '��', '���']], dtype='<U5')

вывод

array([[ 8.50e+01,  0.00e+00,  0.00e+00,  1.98e+03,  0.00e+00,  0.00e+00],
       [ 2.33e+02,  5.40e+01,  2.70e+01, -1.00e+00,  0.00e+00,  0.00e+00],
       [ 0.00e+00,  0.00e+00,  0.00e+00,  0.00e+00,  0.00e+00,  0.00e+00]])
0 голосов
/ 19 марта 2019

Это означает, что размерность строки (���) не является фиксированной на графике и может варьироваться между вызовами выполнения. Символ вопросительного знака указывает tf.TensorShape Любой тензор, возвращаемый Session.run или eval, является массивом NumPy.

>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class 'numpy.ndarray'>

Или:

>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

Или, что эквивалентно:

>>> sess = tf.Session()
>>> with sess.as_default():
>>>    print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

Не любой тензор, возвращаемый Session.run или eval ()массив NumPy.Например, разреженные тензоры возвращаются как SparseTensorValue:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>
...