我有如下的输入Dataframe,其中输入列是动态的,也就是说,它可以是n个类似input1到input2的数字
+----+----+-------+------+------+
|dim1|dim2| byvar|input1|input2|
+----+----+-------+------+------+
| 101| 102|MTD0001| 1| 10|
| 101| 102|MTD0002| 2| 12|
| 101| 102|MTD0003| 3| 13|
想修改列如下,怎么可能?
+----+----+-------+----------+------+
|dim1|dim2| byvar|TRAMS_NAME|values|
+----+----+-------+----------+------+
| 101| 102|MTD0001| input1| 1|
| 101| 102|MTD0001| input2| 10|
| 101| 102|MTD0002| input1| 2|
| 101| 102|MTD0002| input2| 12|
| 101| 102|MTD0003| input1| 3|
| 101| 102|MTD0003| input2| 13|
我使用了create\u map spark方法,但这是一种硬编码的方法。有没有其他方法可以达到同样的效果??
2条答案
按热度按时间fkvaft9z1#
下面是使用stack()函数解决问题的另一种方法。当然,这可能会简单一点,但有一个限制,即必须显式地放置列名。
希望这有帮助!
如果我们想动态地设置要堆栈的列,我们只需要设置未更改的列,在您的示例中是dim1、dim2和byvar,并使用for循环创建堆栈语句。
如果我们使用不同的Dataframe运行相同的代码,您将得到所需的结果。
z0qdvdin2#
Sample DataFrame:
```df.show() #added more columns to show code is dynamic
+----+----+-------+------+------+------+------+------+------+
|dim1|dim2| byvar|input1|input2|input3|input4|input5|input6|
+----+----+-------+------+------+------+------+------+------+
| 101| 102|MTD0001| 1| 10| 3| 6| 10| 13|
| 101| 102|MTD0002| 2| 12| 4| 8| 11| 14|
| 101| 102|MTD0003| 3| 13| 5| 9| 12| 15|
+----+----+-------+------+------+------+------+------+------+