Dans SparkDf, lors du passage du maintien horizontal au maintien vertical pour une colonne avec DF, cela a pris un certain temps, alors enregistrez-le sous forme de mémorandum. Pour le moment, le code source est Scala, mais il ne devrait pas beaucoup changer avec Python.
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|
+-------+-------+-------+-------+
*/
La tenue verticale → la tenue horizontale est facile et vous pouvez facilement le faire avec le pivot. Lors de son utilisation, il est nécessaire d'utiliser trois méthodes telles que "df.groupby (). Pivot (). Count ()".
pivot.scala
val test2Df = testDf
.groupBy("Column1")
.pivot("Column2") //Colonne que vous souhaitez tenir horizontalement
.count() //Fonction d'agrégation
.na.fill(0) //Remplir avec zéro
/*
+-------+---+---+---+
|Column1| a| c| d|
+-------+---+---+---+
| 1| 2| 0| 0|
| 3| 0| 1| 0|
| 4| 0| 0| 1|
| 2| 1| 0| 2|
+-------+---+---+---+
*/
Dans le sujet principal, si vous avez test2Df et que vous souhaitez le maintenir verticalement pour une raison quelconque. Tenue horizontale → La tenue verticale n'a pas de fonction qui peut être réalisée en un seul coup comme le pivot, est-ce un peu gênant? Ajouter. Ceux utilisés sont "selectExpr ()" et "stack". Le code source est le suivant.
unpivot.scala
val test3Df = test2Df
.selectExpr(
"Column1",//Colonne cible servant de référence pour le maintien vertical
"stack(3,'a',a,'c',c,'d',d)".//Original à tenir verticalement
)
/*
+-------+----+----+
|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|
+-------+----+----+
*/
Il peut être transformé comme ça. Tout d'abord, spécifiez la colonne cible qui sera tenue verticalement, puis utilisez stack () pour spécifier la source qui sera tenue verticalement. Dans le cas ci-dessus, a, c et d sont tenus verticalement pour Colonne1. 3 in stack () fait référence au nombre d'exploitations verticales (dans ce cas, 3 de a, c, d), "a" "c" "d" fait référence au nom et acd fait référence à la valeur numérique d'origine du nom de la colonne. (Vous pouvez également saisir simplement "nom1" ou une chaîne de caractères). De plus, le nom de la colonne est col0 par défaut, donc si vous voulez le changer, vous pouvez le changer en utilisant **. WithColumnRenamed ("col0", "○○") **.
Après cela, je pense que si vous utilisez bien la jointure, vous pouvez passer d'une tenue verticale à une tenue horizontale.
How to Pivot and Unpivot a Spark DataFrame
Recommended Posts