web-dev-qa-db-ja.com

pysparkデータフレームで文字列型の列をint形式に変換する方法は?

Pysparkにデータフレームがあります。その数値列の一部には「nan」が含まれているため、データを読み取り、データフレームのスキーマを確認するとき、これらの列は「string」型になります。それらをint型に変更するにはどうすればよいですか?「nan」値を0に置き換えてスキーマを再度チェックしましたが、それらの列の文字列型も表示しています。以下のコードに従います。

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

私のデータは次のようになります: enter image description here

ここでは、整数値を含む「Plays」列と「drafts」列がありますが、これらの列にはnanが存在するため、文字列型として扱われます。

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

各列に対してループを実行できますが、これは文字列の列を整数に変換する最も簡単な方法です。

39
Sahil Desai

cast0に置き換えた後、NaN(intとして)を使用できます。

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

別の方法は、変更が必要なフィールドが複数ある場合にStructFieldを使用することです。

例:

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)

出力:

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)

後:

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)

これはキャストするための少し長い手順ですが、利点はすべての必須フィールドを実行できることです。

必要なフィールドにのみデータタイプが割り当てられている場合、結果のデータフレームには変更されたフィールドのみが含まれることに注意してください。