Совокупная сумма столбца

У меня есть набор данных, который выглядит так

Дф=

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
129
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте этот код. У тебя все скобки перепутались.

df.select(
    *df.columns[:2],
    *[F.sum(F.col(i)).over(Window.orderBy('Month')).alias(i) for i in df.columns[2:8]]
)

Это выполняет свою работу, но не могли бы вы объяснить синтаксис для лучшего понимания. Спасибо.

Mandibajr 19.12.2020 12:49

Звездочка @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]), ......

mck 19.12.2020 12:59

Спасибо, это было познавательно

Mandibajr 19.12.2020 18:49

Вам нужно суммировать() по всему порядку кадров данных по месяцам. Попробуй это

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      |
+-------+-----------+--------+--------+--------+--------+---+--------+--------+

Другие вопросы по теме