In SparkDf dauerte der Wechsel von horizontalem zu vertikalem Halten für eine Spalte mit DF einige Zeit. Zeichnen Sie ihn daher als Memorandum auf. Derzeit ist der Quellcode Scala, aber mit Python sollte sich daran nicht so viel ändern.
testDf.scala
val testDf = Seq(
(1,"a",30,20),
(2,"a",40,30),
(3,"c",50,40),
(4,"d",60,50),
(2,"d",40,70),
(2,"d",20,10),
(1,"a",60,90)
)
.toDF("Column1", "Column2", "Column3","Column4")
/*
+-------+-------+-------+-------+
|Column1|Column2|Column3|Column4|
+-------+-------+-------+-------+
| 1| a| 30| 20|
| 2| a| 40| 30|
| 3| c| 50| 40|
| 4| d| 60| 50|
| 2| d| 40| 70|
| 2| d| 20| 10|
| 1| a| 60| 90|
+-------+-------+-------+-------+
*/
Vertikales Halten → horizontales Halten ist einfach und Sie können es leicht mit Pivot machen. Bei der Verwendung müssen drei Methoden verwendet werden, z. B. "df.groupby (). Pivot (). Count ()".
pivot.scala
val test2Df = testDf
.groupBy("Column1")
.pivot("Column2") //Spalte, die Sie horizontal halten möchten
.count() //Aggregatfunktion
.na.fill(0) //Mit Null füllen
/*
+-------+---+---+---+
|Column1| a| c| d|
+-------+---+---+---+
| 1| 2| 0| 0|
| 3| 0| 1| 0|
| 4| 0| 0| 1|
| 2| 1| 0| 2|
+-------+---+---+---+
*/
Im Hauptthema, wenn Sie test2Df haben und es aus irgendeinem Grund vertikal halten möchten. Horizontales Halten → Vertikales Halten hat keine Funktion, die auf einmal ausgeführt werden kann, wie z. B. Pivot. Ist es ein wenig mühsam? Hinzufügen. Die verwendeten sind "selectExpr ()" und "stack". Der Quellcode lautet wie folgt.
unpivot.scala
val test3Df = test2Df
.selectExpr(
"Column1",//Zielspalte, die als Referenz für das vertikale Halten dient
"stack(3,'a',a,'c',c,'d',d)".//Original senkrecht zu halten
)
/*
+-------+----+----+
|Column1|col0|col1|
+-------+----+----+
| 1| a| 2|
| 1| c| 0|
| 1| d| 0|
| 3| a| 0|
| 3| c| 1|
| 3| d| 0|
| 4| a| 0|
| 4| c| 0|
| 4| d| 1|
| 2| a| 1|
| 2| c| 0|
| 2| d| 2|
+-------+----+----+
*/
Es kann so transformiert werden. Geben Sie zunächst die Zielspalte an, die vertikal gehalten werden soll, und geben Sie dann mit stack () die Quelle an, die vertikal gehalten werden soll. Im obigen Fall werden a, c und d für Spalte 1 vertikal gehalten. 3 in stack () bezieht sich auf die Anzahl der vertikalen Bestände (3 in diesem Fall a, c, d), "a" "c" "d" bezieht sich auf den Namen und acd bezieht sich auf den ursprünglichen numerischen Wert des Spaltennamens (Sie können auch einfach "name1" oder eine Zeichenkette eingeben). Außerdem lautet der Spaltenname standardmäßig col0. Wenn Sie ihn ändern möchten, können Sie ihn mit ** ändern. WithColumnRenamed ("col0", "○○") **.
Danach denke ich, dass Sie, wenn Sie Join gut verwenden, von vertikalem Halten zu horizontalem Halten wechseln können.