首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何添加/包括页尾表中的标题行和总计行?

如何添加/包括页尾表中的标题行和总计行?
EN

Stack Overflow用户
提问于 2019-11-15 17:48:21
回答 1查看 458关注 0票数 0

我正在通过PySpark将数据导出到Excel。我有一组数据

代码语言:javascript
复制
df_raw = spark.createDataFrame([("2015-10", 'U.S.', 500), \
                                ("2018-10", 'Germany', 580), \
                                ("2019-08", 'Japan', 230), \
                                ("2015-12", 'U.S.', 500), \
                                ("2015-11", 'Germany', 580), \
                                ("2015-12", 'Japan', 502), \
                                ("2018-10", 'U.S.', 520), \
                                ("2019-08", 'Canada', 200)]).toDF("ym", "country", "points")
+-------+-------+------+
|     ym|country|points|
+-------+-------+------+
|2015-10|   U.S.|   500|
|2018-10|Germany|   580|
|2019-08|  Japan|   230|
|2015-12|   U.S.|   500|
|2015-11|Germany|   580|
|2015-12|  Japan|   502|
|2018-10|   U.S.|   520|
|2019-08| Canada|   200|
+-------+-------+------+

我把它转换成一个枢轴表

代码语言:javascript
复制
df_pivot = df_raw.groupBy('country').pivot("ym").sum('points')
+-------+-------+-------+-------+-------+-------+
|country|2015-10|2015-11|2015-12|2018-10|2019-08|
+-------+-------+-------+-------+-------+-------+
|Germany|   null|    580|   null|    580|   null|
|   U.S.|    500|   null|    500|    520|   null|
| Canada|   null|   null|   null|   null|    200|
|  Japan|   null|   null|    502|   null|    230|
+-------+-------+-------+-------+-------+-------+

我希望通过Openpyxl将标题行和总计行导出到Excel电子表格中。

我可以使用.collect()循环遍历数据,并将记录附加到工作表中,但它不包括标题,我还想添加一个总计行。

总计行的示例:

代码语言:javascript
复制
+-------+-------+-------+-------+-------+-------+
|country|2015-10|2015-11|2015-12|2018-10|2019-08|
+-------+-------+-------+-------+-------+-------+
|Germany|   null|    580|   null|    580|   null|
|   U.S.|    500|   null|    500|    520|   null|
| Canada|   null|   null|   null|   null|    200|
|  Japan|   null|   null|    502|   null|    230|
+-------+-------+-------+-------+-------+-------+
|       |    500|    580|   1002|   1100|    430|
+-------+-------+-------+-------+-------+-------+

我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-15 18:24:03

试着看一下rollup函数,然后把它统一起来。

代码语言:javascript
复制
df = df_raw.groupBy('country').pivot("ym").sum('points')
df2 = df.rollup('country').count()

或者,只需获取支点的输出,动态地选择日期列(在regex模式或其他方面),并使用sum()聚合它们,并将别名返回到列名中。

编辑:现在我明白你到底想要什么。我仍然使用rollup,但是结合了一些重命名和联合,例如:

代码语言:javascript
复制
from functools import reduce

agg_cols = df_pivot.columns[1:]
rollup_df = df_pivot.rollup().sum()

renamed_df = reduce(
    lambda rollup_df, idx: rollup_df.withColumnRenamed(rollup_df.columns[idx], agg_cols[idx]), 
    range(len(rollup_df.columns)), rollup_df
)

renamed_df = renamed_df.withColumn('country', f.lit('Total'))

df_pivot.unionByName(
    renamed_df
).show()

输出:

代码语言:javascript
复制
+-------+-------+-------+-------+-------+-------+
|country|2015-10|2015-11|2015-12|2018-10|2019-08|
+-------+-------+-------+-------+-------+-------+
|Germany|   null|    580|   null|    580|   null|
|   U.S.|    500|   null|    500|    520|   null|
| Canada|   null|   null|   null|   null|    200|
|  Japan|   null|   null|    502|   null|    230|
|  Total|    500|    580|   1002|   1100|    430|
+-------+-------+-------+-------+-------+-------+

在PySpark 2.4.3上测试

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58882259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档