Pyspark 数据框将多列转换为浮点数

Posted

技术标签:

【中文标题】Pyspark 数据框将多列转换为浮点数【英文标题】:Pyspark dataframe convert multiple columns to float 【发布时间】:2016-11-08 02:31:24 【问题描述】:

我正在尝试将数据帧的多列从字符串转换为像这样的浮点数

df_temp = sc.parallelize([("1", "2", "3.4555"), ("5.6", "6.7", "7.8")]).toDF(("x", "y", "z"))
df_temp.select(*(float(col(c)).alias(c) for c in df_temp.columns)).show()

但我收到了错误

select() argument after * must be a sequence, not generator

我不明白为什么会抛出这个错误

【问题讨论】:

【参考方案1】:

float()不是Spark函数,需要cast()函数:

from pyspark.sql.functions import col
df_temp.select(*(col(c).cast("float").alias(c) for c in df_temp.columns))

【讨论】:

需要 pyspark.sql.functions import col 在哪里可以了解有关此语法的更多信息 (col(c).cast("float").alias(c) for c in df_temp.columns) ?这里的“for”语句是在转换动作之后出现的。 这应该比 nimerasam 的答案更快吗?如何仅将其应用于数据框的某些列? @hipoglucido 而不是df_temp.columns,您可以提供任意列的列表【参考方案2】:

如果你想在不改变整个数据框的情况下转换一些列,你可以通过 withColumn 函数来实现:

for col_name in cols:
    df = df.withColumn(col_name, col(col_name).cast('float'))

这将在 cols 列表中转换列类型并保持其他列不变。注意withColumn 函数用于替换或创建新列基于列名;如果列名存在,它将被替换,否则将被创建

【讨论】:

它可以工作,但非常非常慢。有没有更好的方法将所有列转换为浮点类型?【参考方案3】:

如果要将多个列强制转换为浮动并保持其他列相同,则可以使用单个 select 语句。

columns_to_cast = ["col1", "col2", "col3"]
df_temp = (
   df
   .select(
     *(c for c in df.columns if c not in columns_to_cast),
     *(col(c).cast("float").alias(c) for c in columns_to_cast)
   )
)

我看到了 withColumn 答案,但由于 spark 数据帧是不可变的,每个 withColumn 调用都会生成一个全新的数据帧

【讨论】:

【参考方案4】:

这是另一种方法:

cv = []   # list of columns you want to convert to Float
cf = []   # list of columns you don't want to change

l = ['float(x.'+c+')' for c in cv]
cst = '('+','.join(l)+')'

l2 = ['x.'+c for c in cf]
cst2 = '('+','.join(l2)+')'

df2rdd = df.map(lambda x : eval(cst2)+eval(cst))

df_output = sqlContext.createDataFrame(df2rdd,df.columns)

df_output 是您需要的数据框

【讨论】:

以上是关于Pyspark 数据框将多列转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

从镶木地板自动推断模式/有选择地将字符串转换为浮点数

ValueError:无法将字符串转换为浮点数:'GIAC'

图像数据无法转换为浮点数错误?

带有前缀的Python熊猫数据框字符串转换为浮点数

如何将表示为字符串的数字转换为浮点数

在 Swift 中将半精度浮点数(字节)转换为浮点数