ValueError:文字列をfloatに変換できませんでした:'���'

(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") 

に変換するとfloat datatype、using

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] 

show 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") 

回答

最善の解決策ではありませんが、パンダのデータフレームに変換することである程度の成功を収めました。

コードスニペット

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

回答

パンダのデータフレームを使用してみましょう文字列を数値クラスに変換します

上記のconvert()関数を次のように呼び出します。test= convert(test)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です