我有一个多列的pyspark数据框,如下所示:
name col1 col2 col3
A 1 6 7
B 2 7 6
C 3 8 5
D 4 9 4
E 5 8 3
我想在pyspark中通过将col1,col2,col3的列名和列值组合成两个新的列(例如,跨行分布的new_col和new_col_val)来创建一个新的数据框:
我在R中使用以下代码进行了相同的操作:
df1 <- gather(df,new_col,new_col_val,-name)
我当时想创建3个单独的数据框,这些数据框将包含原始数据框的每一列,然后将它们附加在一起,但是我的数据有超过2500k行和大约60列。创建多个数据帧将是最糟糕的主意。谁能告诉我如何在pyspark中做到这一点?
您可以用于unionAll
将列转换为行,lit
还可以用于指定列名,如下所示,
from pyspark.sql.functions import lit
df2 = df.select(df.columns[0], lit(df.columns[1]).alias('new_col'),
df[df.columns[1]].alias('new_col_val'))
for i in df.columns[2:]:
df2 = df2.unionAll(df.select(df.columns[0], lit(i), df[i]))
输出:
+----+-------+-----------+
|name|new_col|new_col_val|
+----+-------+-----------+
| A| col1| 1|
| B| col1| 2|
| C| col1| 3|
| D| col1| 4|
| E| col1| 5|
| A| col2| 6|
| B| col2| 7|
| C| col2| 8|
| D| col2| 9|
| E| col2| 8|
| A| col3| 7|
| B| col3| 6|
| C| col3| 5|
| D| col3| 4|
| E| col3| 3|
+----+-------+-----------+
注意:所有列必须具有相同的数据类型。
要检查列是否具有相同的数据类型,
if len(set(map(lambda x: x[-1], df.dtypes[1:]))) != 1:
raise AssertionError("All columns must be of the same datatype")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句