У меня есть набор данных, который выглядит так
Дф=
Month month_index QA_count BS_count BV_count QT_count B QB_count BT_count BW_count
2019-07 0 3 0 1 1 2 3 7
2019-08 1 1 1 1 1 5 9 1
2019-09 2 1 1 1 1 5 9 1
2019-10 3 1 1 1 1 5 9 1
I will like to get an output similar to this
Month month_index QA_count BS_count BV_count QT_count B QB_count BT_count BW_count
2019-07 0 3 0 1 1 2 3 7
2019-08 1 4 1 2 2 7 12 8
2019-09 2 5 2 3 3 12 21 9
2019-10 3 6 3 4 4 17 30 10
Я пробовал df.withcolumn("*",(F.sum(F.col(i)).over((Window.orderBy('Month')) for i in df.columns[2:8), как было предложено, но получил неверный синтаксис. Как я могу получить совокупную сумму нужного столбца в pyspark, поскольку я новичок в pyspark
Попробуйте этот код. У тебя все скобки перепутались.
df.select(
*df.columns[:2],
*[F.sum(F.col(i)).over(Window.orderBy('Month')).alias(i) for i in df.columns[2:8]]
)
Звездочка @Mandibajr означает распаковку списка, поэтому, если я выпишу их все, это будет как df.select(df.columns[0], df.columns[1], F.sum(F.col(df.columns[2]).over(..)).alias(df.columns[2]), F.sum(F.col(df.columns[3]).over(..)).alias(df.columns[3]), ......
Спасибо, это было познавательно
Вам нужно суммировать() по всему порядку кадров данных по месяцам. Попробуй это
df = spark.sql(""" with t1 (
select '2019-07' c1, 0 c2, 3 c3, 0 c4, 1 c5, 1 c6, 2 c7, 3 c8, 7 c9 union all
select '2019-08' c1, 1 c2, 1 c3, 1 c4, 1 c5, 1 c6, 5 c7, 9 c8, 1 c9 union all
select '2019-09' c1, 1 c2, 1 c3, 1 c4, 1 c5, 1 c6, 5 c7, 9 c8, 1 c9 union all
select '2019-10' c1, 1 c2, 1 c3, 1 c4, 1 c5, 1 c6, 5 c7, 9 c8, 1 c9
) select c1 Month, c2 month_index, c3 QA_count, c4 BS_count, c5 BV_count, c6 QT_count, c7 B, c8 QB_count, c9 BT_count from t1
""")
df.show(truncate=False)
+-------+-----------+--------+--------+--------+--------+---+--------+--------+
|Month |month_index|QA_count|BS_count|BV_count|QT_count|B |QB_count|BT_count|
+-------+-----------+--------+--------+--------+--------+---+--------+--------+
|2019-07|0 |3 |0 |1 |1 |2 |3 |7 |
|2019-08|1 |1 |1 |1 |1 |5 |9 |1 |
|2019-09|1 |1 |1 |1 |1 |5 |9 |1 |
|2019-10|1 |1 |1 |1 |1 |5 |9 |1 |
+-------+-----------+--------+--------+--------+--------+---+--------+--------+
Получите столбцы, которые необходимо суммировать:
cols=df.columns
cols_new=cols[2:]
for c in cols_new:
df=df.withColumn(c,expr(f"sum({c}) over(order by month) "))
df.show(truncate=False)
+-------+-----------+--------+--------+--------+--------+---+--------+--------+
|Month |month_index|QA_count|BS_count|BV_count|QT_count|B |QB_count|BT_count|
+-------+-----------+--------+--------+--------+--------+---+--------+--------+
|2019-07|0 |3 |0 |1 |1 |2 |3 |7 |
|2019-08|1 |4 |1 |2 |2 |7 |12 |8 |
|2019-09|1 |5 |2 |3 |3 |12 |21 |9 |
|2019-10|1 |6 |3 |4 |4 |17 |30 |10 |
+-------+-----------+--------+--------+--------+--------+---+--------+--------+
Это выполняет свою работу, но не могли бы вы объяснить синтаксис для лучшего понимания. Спасибо.