在连接两个数据框之后,我发现列顺序已经改变了我想象中的顺序。
示例:在b
上连接具有列[b,c,d,e]
和[a,b]
的两个数据帧,得到列顺序为[b,a,c,d,e]
。
我如何改变列的顺序(例如,[a,b,c,d,e]
)?我已经找到了在Python/R中做到这一点的方法,但没有Scala或Java。是否存在允许交换或重新排序数据框列的方法?
在Scala中,你可以使用"splat" (:_*
)语法将一个可变长度的列列表传递给DataFrame.select()
方法。
为了解决您的示例,您可以通过DataFrame.columns
获得现有列的列表,该列表返回字符串数组。然后对该数组进行排序,并将值转换为列。然后,您可以"splat"输出到select()
方法:
val mySortedCols = myDF.columns.sorted.map(str => col(str))
// Array[String]=(b,a,c,d,e) => Array[Column]=(a,b,c,d,e)
val myNewDF = myDF.select(mySortedCols:_*)
一种方法是在join之后重新排序:
case class Person(name : String, age: Int)
val persons = Seq(Person("test", 10)).toDF
persons.show
+----+---+
|name|age|
+----+---+
|test| 10|
+----+---+
persons.select("age", "name").show
+---+----+
|age|name|
+---+----+
| 10|test|
+---+----+