web-dev-qa-db-fra.com

Comment convertir une colonne de type chaîne en forme int dans un cadre de données pyspark?

J'ai dataframe dans pyspark. Certaines de ses colonnes numériques contiennent «nan». Par conséquent, lorsque je lis les données et que je vérifie le schéma du cadre de données, ces colonnes auront le type «chaîne». Comment puis-je les changer en int type.J'ai remplacé les valeurs 'nan' par 0 et vérifié à nouveau le schéma, mais il montre également le type de chaîne pour ces colonnes.

data_df = sqlContext.read.format("csv").load('data.csv',header=True, inferSchema="true")
data_df.printSchema()
data_df = data_df.fillna(0)
data_df.printSchema()

mes données ressemble à ceci:  enter image description here

ici, les colonnes 'Jeux' et 'Brouillons' contenant des valeurs entières, mais à cause de la présence de nan dans ces colonnes, elles sont traitées comme un type de chaîne.

8
neha
from pyspark.sql.types import IntegerType
data_df = data_df.withColumn("Plays", data_df["Plays"].cast(IntegerType()))
data_df = data_df.withColumn("drafts", data_df["drafts"].cast(IntegerType()))

Vous pouvez exécuter des boucles pour chaque colonne, mais c’est le moyen le plus simple de convertir une colonne de chaîne en entier.

23
Sahil Desai

Vous pouvez utiliser cast (as int) après avoir remplacé NaN par 0,

data_df = df.withColumn("Plays", df.call_time.cast('float'))
2
Ani Menon

Une autre façon de le faire consiste à utiliser le StructField si vous avez plusieurs champs à modifier.

Ex:

from pyspark.sql.types import StructField,IntegerType, StructType,StringType
newDF=[StructField('CLICK_FLG',IntegerType(),True),
       StructField('OPEN_FLG',IntegerType(),True),
       StructField('I1_GNDR_CODE',StringType(),True),
       StructField('TRW_INCOME_CD_V4',StringType(),True),
       StructField('ASIAN_CD',IntegerType(),True),
       StructField('I1_INDIV_HHLD_STATUS_CODE',IntegerType(),True)
       ]
finalStruct=StructType(fields=newDF)
df=spark.read.csv('ctor.csv',schema=finalStruct)

Sortie:

Avant

root
 |-- CLICK_FLG: string (nullable = true)
 |-- OPEN_FLG: string (nullable = true)
 |-- I1_GNDR_CODE: string (nullable = true)
 |-- TRW_INCOME_CD_V4: string (nullable = true)
 |-- ASIAN_CD: integer (nullable = true)
 |-- I1_INDIV_HHLD_STATUS_CODE: string (nullable = true)

Après:

root
 |-- CLICK_FLG: integer (nullable = true)
 |-- OPEN_FLG: integer (nullable = true)
 |-- I1_GNDR_CODE: string (nullable = true)
 |-- TRW_INCOME_CD_V4: string (nullable = true)
 |-- ASIAN_CD: integer (nullable = true)
 |-- I1_INDIV_HHLD_STATUS_CODE: integer (nullable = true)

La procédure est légèrement longue à lancer, mais l’avantage est que tous les champs requis peuvent être remplis.

Il est à noter que si le type de données est affecté aux champs obligatoires, la trame de données résultante ne contiendra que les champs modifiés.