Agrupe por Id y obtenga múltiples registros para múltiples columnas en Scala.
Tengo un dataframe de chispa como se muestra a continuación.
val df = Seq(("a",1,1400),("a",1,1250),("a",2,1200),("a",4,1250),("a",4,1200),("a",4,1100),("b",2,2500),("b",2,1250),("b",2,500),("b",4,250),("b",4,200),("b",4,100),("b",4,100),("b",5,800)).
toDF("id","jerarquía","cantidad")
Estoy trabajando en el lenguaje de scala para hacer uso de este dataframe y tratando de obtener el resultado como se muestra a continuación.
val df = Seq(("a",1,1400),("a",4,1250),("a",4,1200),("a",4,1100),("b",2,2500),("b",2,1250),("b",4,250),("b",4,200),("b",4,100),("b",5,800)).
toDF("id","jerarquía","cantidad")
Reglas: Agrupado por id, si min(hierarchy)==1 entonces tomo la fila con la cantidad más alta y luego paso a analizar la jerarquía >= 4 y tomo 3 de cada una de ellas en orden descendente de la cantidad. Por otro lado, si min(jerarquía)==2 entonces tomo dos filas con la cantidad más alta y luego paso a analizar la jerarquía >= 4 y tomo 3 de cada una de ellas en orden descendente de la cantidad. Y así sucesivamente para todos los id’s en los datos.
Gracias por las sugerencias..
davy.ai
Para lograr el resultado deseado, necesitamos agrupar el marco de datos por
id
y luego aplicar ciertas condiciones basadas en el valor jerárquico mínimo presente en cada grupo. Esto puede implementarse utilizando las funcionesgroupBy
,agg
,when
yotherwise
de la siguiente manera:Aquí, usamos la función
when
para aplicar diferentes condiciones basadas en el valor jerárquico mínimo en cada grupo. Paramin("hierarchy") === 1
, seleccionamos la fila con la cantidad más alta. Paramin("hierarchy") === 2
, seleccionamos las dos filas con la cantidad más alta y creamos una lista de valores de jerarquía y cantidad para jerarquía>=4. Para todos los demás casos, seleccionamos tres filas con la cantidad más alta para jerarquía>=4 y creamos una lista similar.A continuación, ordenamos el marco de datos resultante por
id
,flag
(determinado por el valor jerárquico mínimo) yamount
en orden descendente. Usamosexplode_outer
para desagrupar la lista de jerarquía paraflag=2
oflag=3
y luego agrupamos el marco de datos porid
,flag
, y tomamos los primeros tres valores.Finalmente, seleccionamos las columnas
id
,hierarchy
yamount
y ordenamos el marco de datos porid
yhierarchy
en orden descendente.El marco de datos resultante
df_new
tendrá el resultado deseado como se muestra en la pregunta.