#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')
.