如何在pyspark数据帧中将字符串类型的列转换为int形式?

2024-10-10 22:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pyspark有数据帧。它的一些数字列包含“nan”,因此当我读取数据并检查dataframe的模式时,这些列将具有“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,因此它们被视为字符串类型。


Tags: csv数据字符串类型dataframedfdatastring
3条回答

另一种方法是,如果有多个字段需要修改,则使用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)

这是一个稍长的转换过程,但其优点是可以完成所有必需的字段。

需要注意的是,如果只为必需字段分配了数据类型,那么结果数据帧将只包含那些已更改的字段。

在用0替换NaN之后,可以使用cast(作为int)

data_df = df.withColumn("Plays", df.call_time.cast('float'))
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()))

可以为每列运行循环,但这是将字符串列转换为整数的最简单方法。

相关问题 更多 >