【问题标题】:ValueError: could not convert string to float: '���'ValueError:无法将字符串转换为浮点数:'���'
【发布时间】:2019-03-27 05:32:13
【问题描述】:

我有一个 (2M, 23) 维 numpy 数组 X。它的 dtype 为<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)

我收到如上所示的错误。我正在尝试找到如何解决 '���' 的字符串格式错误。

这是什么意思(它叫什么?),我该如何解决这个错误?

编辑:有关如何读取数据的信息:-

导入相关包

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

【问题讨论】:

  • 您如何读取该数据? 是 Unicode 替换字符,在使用错误代码页读取 ASCII 文本时使用。看起来源包含使用错误代码页读取的非数字数据。即使使用了正确的代码页,文本仍然是无效的
  • 如果你是 Python 解释器,你会如何将'���' 转换为浮点数?那代表哪个数字?你想要的结果是什么?
  • @PanagiotisKanavos:我使用 collect() 方法从 pyspark 数据帧中读取它。
  • @zvone:完全正确!我希望我知道 URC(???) 以前是什么。所需的结果是浮点值的 numpy 数组。

标签: python numpy pyspark python-unicode


【解决方案1】:

这意味着 string(���) 维度在图中不是固定的,它可以在运行调用之间变化 问号符号表示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'>

【讨论】:

    【解决方案2】:

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

    代码 sn-p

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-23
      • 2018-06-13
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2019-12-19
      相关资源
      最近更新 更多