ValueError:无法将字符串转换为浮点数:'���'

数据挖掘 Python 数据框 CSV 数据格式
2021-10-08 12:45:37

我有一个 (2M, 23) 维numpy数组X它的数据类型为<U26,即 26 个字符的 unicode 字符串。

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)

我收到如上所示的错误。如何解决“���”的字符串格式错误?

我意识到数据框中的某些字符没有被正确读取,而 unicode 替换字符只是它的结果。

我的问题:-

  1. 我该如何处理这种误读?
  2. 我应该忽略这些字符吗?或者我应该将它们转换为零吗?

有关如何读取数据的其他信息:-

导入相关包

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个回答

虽然不是最好的解决方案,但我通过将其转换为 pandas 数据框并继续工作找到了一些成功。

代码片段

# 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)

输入

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]])

让我们尝试使用 pandas 数据框并将字符串转换为数字类

from sklearn import preprocessing

def convert(data):
    number = preprocessing.LabelEncoder()
    data['column_name'] = number.fit_transform(data['column_name'])
    data=data.fillna(-999) # fill holes with default value
    return data

调用上面的 convert() 函数,例如 test = convert(test)