我有一个pyspark数据框,如下所示:
df.show()
+---+
|dim|
+---+
|1x1|
|0x0|
|1x0|
+---+
dim
中的数据类型为str
。现在我想将dim
分成2列,并且有类似的内容:
df.show()
+---+----+----+
|dim|dim1|dim2|
+---+----+----+
|1x1| 1| 1|
|0x0| 0| 0|
|1x0| 1| 0|
+---+----+----+
我知道如果我要对单个字符串进行操作,我只需在python:split()
中使用"1x1".split("x")
方法,但如何在一列中同时创建多个列通过拆分函数映射?
答案 0 :(得分:2)
你可以尝试
from pyspark.sql.functions import split
df_temp = df.withColumn("dim1", split("dim", "x")[0])
df_new = df_temp.withColumn("dim2", split("dim", "x")[1])
df_new.show()
或者您可以通过一次通话将这些链接在一起:
df_new = df.withColumn("dim1", split("dim", "x")[0])\
.withColumn("dim2", split("dim", "x")[1])
答案 1 :(得分:2)
另一种选择是使用rdd
和map()
:
df = df.rdd.map(lambda row: (row['dim'],) + tuple(row['dim'].split('x')))\
.toDF(["dim", "dim1", "dim2"])
df.show()
#+---+----+----+
#|dim|dim1|dim2|
#+---+----+----+
#|1x1| 1| 1|
#|0x0| 0| 0|
#|1x0| 1| 0|
#+---+----+----+
以下是@Grace O'Halloran answer在循环中使用pyspark.sql.functions.split()
而不是枚举可能性的修改(如果您有大量维度则很有用):
ndim = 2
import pyspark.sql.functions as f
for d in range(ndim):
df = df.withColumn('dim{}'.format(d+1), f.split('dim', 'x')[d])