#dataframe #pyspark #pyspark-sql #union-all
#dataframe #pyspark #apache-spark-sql #объединение-все
Вопрос:
У меня есть dataframe, который состоит из 3 строк и более 20 столбцов (даты)
---- ----- -----
|Cat |01/02|02/02|......
---- ----- -----
| a | 20 | 7 |......
| b | 30 | 12 |......
---- --- -------
и я хочу получить сумму из каждого столбца и добавить ее в качестве дополнительной строки в dataframe. Другими словами, я ожидаю, что это будет выглядеть следующим образом:
---- ----- -----
|Cat |01/02|02/02|......
---- ----- -----
| a | 20 | 7 |......
| b | 30 | 12 |......
| All| 50 | 19 |......
---- --- -------
Я кодирую в PySpark, и сценарий следующий:
from pyspark.sql import functions as F
for col_name in fs.columns:
print(col_name)
sf = df.unionAll(
df.select([
F.lit('Total').alias('Cat'),
F.sum(fs.col_name).alias("{}").format(col_name)
])
)
К сожалению, я получаю сообщение об ошибке AttributeError: 'DataFrame' object has no attribute 'col_name'
. Есть идеи, что я делаю не так? Заранее благодарим вас!
Комментарии:
1. удалите
fs.
— вы не можете использовать средство доступа к точке для столбца со строковой переменной. Попробуйте:F.sum(F.col(col_name)).alias(col_name)
2. Также я не понимаю ваш цикл — вы выполняете каждый столбец по одному за раз? Вероятно, вы можете достичь того же с помощью чего-то вроде:
df.union(df.select(F.lit("Total").alias("Cat"), *[F.sum(F.col(c)).alias(c) for c in df.columns if c != 'Cat'])