pyspark выполняет агрегированную сумму для нескольких столбцов в фрейме данных

#python #dataframe #pyspark #apache-spark-sql #pyspark-dataframes

#python #фрейм данных #apache-spark-sql #pyspark

Вопрос:

У меня есть образец фрейма входных данных df:

 partner_id|month_id|value1 |value2|price1|price2|
1001      |  01    |10     |20    |1     |2     |
1002      |  01    |20     |30    |2     |3     |
1003      |  01    |30     |40    |3     |4     |
1004      |  02    |40     |50    |4     |5     |
1001      |  02    |50     |60    |5     |6     |
1001      |  02    |60     |70    |6     |7     |
1001      |  03    |70     |80    |7     |8     |
  

Я хочу создать группу в столбце partner_id и суммировать все столбцы значений. Агрегированный код, как показано ниже:

 df = df.groupBy(df.partner_id).agg(F.sum(df.value1).alias("value1"), F.sum(df.value2).alias("value2))
  

результирующий фрейм данных:

 partner_id|value1 |value2|
1002      |20     |30    |
1003      |30     |40    |
1004      |40     |50    |
1001      |190    |230   |
  

Но мне нужно выбрать все остальные столбцы моего входного фрейма данных, соответствующие группе по столбцу, каков наилучший способ достижения?

Ожидаемый результат, подобный:

 partner_id|month_id|value1 |value2|price1|price2|
1002      |  01    |20     |30    |2     |3     |
1003      |  01    |30     |40    |3     |4     |
1004      |  02    |40     |50    |4     |5     |
1001      |  02    |190    |230   |5     |6     |
  

Комментарии:

1. вы выбираете случайную строку оставшихся столбцов? потому что одно и то же значение partner_id может ассоциироваться, например, с несколькими price1 .

Ответ №1:

Каков ваш выбор для столбцов month_id , price1 и price2 ? Я выбрал минимум.

 df.groupBy('partner_id') 
  .agg(min('month_id').alias('month_id'), 
       sum('value1').alias('value1'), 
       sum('value2').alias('value2'), 
       min('price1').alias('price1'), 
       min('price2').alias('price2')) 
  .show()

 ---------- -------- ------ ------ ------ ------ 
|partner_id|month_id|value1|value2|price1|price2|
 ---------- -------- ------ ------ ------ ------ 
|      1002|       1|    20|    30|     2|     3|
|      1001|       1|   190|   230|     1|     2|
|      1003|       1|    30|    40|     3|     4|
|      1004|       2|    40|    50|     4|     5|
 ---------- -------- ------ ------ ------ ------ 
  

Ответ №2:

Это зависит от значений — изменяются ли значения в соответствии с partner_id ? Если да, @lamanus ответ правильный, в противном случае вы можете добавить его в часть groupBy df.groupBy('partner_id' ,'month_id') .