Jai un numpy
tableau X
de dimension (2M, 23). Il a un dtype de <U26
, cest-à-dire une chaîne unicode de 26 caractères.
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")
Quand je le convertis en un type de données float, en utilisant
X_f = X.astype(float)
Jobtiens lerreur comme indiqué ci-dessus. comment résoudre cette erreur de formatage de chaîne pour « ��� »?
Je me rends compte que certains caractères ne sont pas lus correctement dans le dataframe, et le caractère de remplacement Unicode en est juste le résultat.
Mes questions: –
- Comment gérer cette erreur de lecture?
- Dois-je ignorer ces caractères? Ou devrais-je peut-être les transformer à zéro?
Informations supplémentaires sur la façon dont les données ont été lues: –
importation des packages pertinents
from pyspark import SparkContext from pyspark.sql import SQLContext from pyspark.sql.functions import col
chargement de lensemble de données dans un dataframe 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)
vérifier le type de jeu de données.
type(dataset)
pyspark.sql.dataframe.DataFrame
convertir en np array
import numpy as np np_dfr = np.array(data_preprocessing(dataset).collect())
entités et libellés fractionnés
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")
Réponse
Bien que ce ne soit pas la meilleure solution, jai trouvé un certain succès en le convertissant en dataframe pandas et travailler ensemble.
extrait de code
# 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")
sortie
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]])
Réponse
Essayons dutiliser pandas dataframe et convertir des chaînes en classes numériques
appelle la fonction convert () ci-dessus comme, test = convert (test)