PySpark DataFrame行转列问题:按月份转换未达预期结果
PySpark 行转列(按月份映射)解决方案
你之前的写法缺少聚合函数,pivot必须配合聚合操作才能完成行转列的映射,因为分组后需要对每个(Month, col1)组合的值做合并处理。
假设你的原始数据结构(模拟附图常见场景):
| Month | col1 | value |
|---|---|---|
| 1月 | 指标A | 100 |
| 1月 | 指标B | 200 |
| 2月 | 指标A | 150 |
| 2月 | 指标B | 250 |
目标格式:
| Month | 指标A | 指标B |
|---|---|---|
| 1月 | 100 | 200 |
| 2月 | 150 | 250 |
正确实现代码:
from pyspark.sql import functions as F # 替换成你的实际DataFrame名称 raw_df = ... # 核心行转列逻辑:按月份分组 + 转置目标列 + 聚合取值 pivoted_df = raw_df.groupBy("Month") \ .pivot("col1") \ .agg(F.first("value")) # 若每个(Month, col1)组合唯一,用first/max/min都可;有重复数据需合并则用sum # 查看转换结果 pivoted_df.show()
补充说明:
- 聚合函数选择:如果每个(Month, col1)组合只有一条数据,
first/max/min结果一致;如果存在重复数据需要合并计算,改用sum/avg等对应聚合逻辑。 - 月份排序优化:如果需要按月份顺序展示,可额外处理:
# 针对"1月""2月"这类字符串格式的月份提取数字排序 pivoted_df = pivoted_df.withColumn("month_idx", F.substring("Month", 0, 1).cast("int")) \ .orderBy("month_idx") \ .drop("month_idx")
内容的提问来源于stack exchange,提问作者code_bug
相关产品推荐
相关产品推荐

