将 PySpark 数据框的列与标量相乘

Posted

技术标签:

【中文标题】将 PySpark 数据框的列与标量相乘【英文标题】:Multiply column of PySpark dataframe with scalar 【发布时间】:2019-10-18 00:38:03 【问题描述】:

我想将 PySpark 数据帧(例如 df)的一列(例如 x3)与标量(例如 0.1)相乘。以下是我拥有的数据框示例:

df = sqlContext.createDataFrame(
    [(1, "a", 1551.0), (3, "B", 1925.0)], ("x1", "x2", "x3"))

df.show()

+---+---+----+
| x1| x2|  x3|
+---+---+----+
|  1|  a| 5.0|
|  3|  B|21.0|
+---+---+----+

以下是我目前正在尝试的:

df_new = df.withColumn( "norm_x3", 0.1*F.col( "x3") )
df_new = df_new.select( [c for c in df_new.columns if c not in 'x3'] )

我在上面尝试的方法给出了预期的输出:

+---+---+-------+
| x1| x2|norm_x3|
+---+---+-------+
|  1|  a|    0.5|
|  3|  B|    2.1|
+---+---+-------+

有没有更优雅、更简洁的方法来做同样的事情?谢谢。

【问题讨论】:

【参考方案1】:

最优雅的方式就是使用drop

df_new = df.withColumn("norm_x3", 0.1*F.col( "x3")).drop("x3")

或者,您也可以使用withColumnRenamed,但不太可取,因为您正在重载“x3”并且将来可能会导致混乱:

df_new = df.withColumn("x3", 0.1*F.col( "x3")).withColumnRenamed("x3", "norm_x3")

【讨论】:

【参考方案2】:

这是一种在一行中完成的方法:

df.select([(df[c] * 0.1).alias('norm_x3') if c == 'x3' else df[c] for c in df.columns]

或者:

df.selectExpr('*', 'x3 * 0.1 as normal_x3').drop('x3')

【讨论】:

绝妙的答案,Psidom。谢谢。

以上是关于将 PySpark 数据框的列与标量相乘的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas:将数据框的列与列名合并为一列

将 MultiIndex Pandas 数据帧乘以来自另一个数据帧的多个标量

Pyspark - 如何将转换后的列与原始 DataFrame 合并?

如何将数据框中的特定列与同一数据框中的一个特定列相乘?

将pyspark数据框的列转换为小写

如何将一个熊猫数据框的一列与另一个数据框的每一列相加?