[PYTHON] [Spark Data Frame] Ändern Sie eine Spalte von horizontal in vertikal (Scala).

Einführung

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.

Datenrahmenbetrieb

Erstellen eines Test-DataFrame

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

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|
+-------+---+---+---+
*/

Horizontales Halten → Vertikales Halten

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.

Referenzlink

How to Pivot and Unpivot a Spark DataFrame

Recommended Posts

[Spark Data Frame] Ändern Sie eine Spalte von horizontal in vertikal (Scala).
Ändern Sie den Datenrahmen der Pandas-Kaufdaten (ID x Produkt) in ein Wörterbuch
Generieren Sie aus Textdaten ein vertikales Bild eines Romans
Ein Memo, das mit Python & Spark Daten aus dashDB liest
Erstellen Sie einen Datenrahmen aus den erfassten Textdaten des Bootsrennens
[Linux] Kopieren Sie Daten mit einem Shell-Skript von Linux nach Windows
[Python] So erhalten und ändern Sie Zeilen / Spalten / Werte aus einer Tabelle.
Von der Installation von Elasticsearch bis zur Dateneingabe
Ein Memorandum zur Umstellung auf Manjaro Linux
Hat sich nicht von Python 2 auf 3 geändert
Verwenden Sie Matplotlib, um mehrere Liniendiagramme gleichzeitig aus einem Datenrahmen zu erstellen
Geben Sie Geräteereignisse von Catalyst-Switch-Containern an Cisco Spark weiter