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 数据框将多列转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章