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()
ここでは、整数値を含む「Plays」列と「drafts」列がありますが、これらの列にはnanが存在するため、文字列型として扱われます。
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()))
各列に対してループを実行できますが、これは文字列の列を整数に変換する最も簡単な方法です。
cast
を0
に置き換えた後、NaN
(intとして)を使用できます。
data_df = df.withColumn("Plays", df.call_time.cast('float'))
別の方法は、変更が必要なフィールドが複数ある場合に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)
これはキャストするための少し長い手順ですが、利点はすべての必須フィールドを実行できることです。
必要なフィールドにのみデータタイプが割り当てられている場合、結果のデータフレームには変更されたフィールドのみが含まれることに注意してください。