将 PySpark 数据框的列与标量相乘
Multiply column of PySpark dataframe with scalar
我想将 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|
+---+---+-------+
有没有更优雅、更快捷的方法来做同样的事情?谢谢。
这是一种在一行中完成的方法:
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')
最优雅的方法就是简单地使用 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")
我想将 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|
+---+---+-------+
有没有更优雅、更快捷的方法来做同样的事情?谢谢。
这是一种在一行中完成的方法:
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')
最优雅的方法就是简单地使用 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")