【问题标题】:How to convert column with string type to int form in pyspark data frame?如何在pyspark数据框中将字符串类型的列转换为int形式?
【发布时间】:2018-04-07 22:29:00
【问题描述】:

我在 pyspark 中有数据框。它的一些数字列包含nan,因此当我读取数据并检查数据框的架构时,这些列将具有string 类型。

如何将它们更改为 int 类型。我用 0 替换了 nan 值并再次检查了架构,但随后它也显示了这些列的字符串类型。我遵循以下代码:

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

我的数据如下所示:

这里的列 Playsdrafts 包含整数值,但由于这些列中存在 nan,它们被视为字符串类型。

【问题讨论】:

  • 有什么方法可以在读取数据时仅替换 nan,以便在架构中将这些列视为 int 类型。
  • 我相信,在您的情况下,您必须将整列设为整数。

标签: python dataframe apache-spark pyspark apache-spark-sql


【解决方案1】:
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()))

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

【讨论】:

  • 嗨@sahil-desai 它给了我空值。但是,虽然打印模式给了我整数。你能证明这是为什么吗?
  • @Moi 如果值是非数字并且您要对其进行强制转换,那么它将转换为空值。您的数据以前的数据类型是什么?
【解决方案2】:

在将NaN 替换为0 后,您可以使用cast(as int),

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

【讨论】:

    【解决方案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)
    

    这个转换过程有点长,但好处是所有必填字段都可以完成。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2021-05-14
      • 2019-05-07
      相关资源
      最近更新 更多