如何在PySpark 2.4.7中将DataFrame行转列为指定格式?
PySpark 2.4.7 实现DataFrame行转列方案
针对你提供的DataFrame格式,要将多行的feature和count转换为单行多列的结构,可以通过添加行号+转置+列重命名的方式实现,具体步骤如下:
假设原DataFrame名为df,数据结构如下:
+--------+-----+ |feature |count| +--------+-----+ |a |19386| |b |14734| |c |12815| |d |4823 | +--------+-----+
实现代码
from pyspark.sql import functions as F from pyspark.sql.window import Window # 1. 为每行添加递增行号(确保顺序与原数据一致,若需按特定规则排序可修改orderBy内容) window_spec = Window.orderBy(F.lit(1)) # 保持原数据顺序,若要按count降序则改为F.desc("count") df_with_row = df.withColumn("row_num", F.row_number().over(window_spec)) # 2. 转置行数据为列,并提取每组的feature和count pivoted_df = df_with_row.groupBy().pivot("row_num").agg( F.first("feature").alias("value"), F.first("count").alias("count") ) # 3. 重命名列,匹配目标格式的binX_value/binX_count final_df = pivoted_df.select( F.col("1_value").alias("bin1_value"), F.col("2_value").alias("bin2_value"), F.col("3_value").alias("bin3_value"), F.col("4_value").alias("bin4_value"), F.col("1_count").alias("bin1_count"), F.col("2_count").alias("bin2_count"), F.col("3_count").alias("bin3_count"), F.col("4_count").alias("bin4_count") ) # 查看结果 final_df.show()
关键说明
- 行号生成:用
row_number()窗口函数为每行分配唯一序号,保证转置后的列顺序与原数据行顺序匹配;若需要自定义排序规则,修改orderBy参数即可(比如按count降序排列)。 - 转置逻辑:通过
pivot将行号作为列的分组依据,提取每组对应的feature和count值。 - 列重命名:将转置后的列名调整为目标格式,最终得到单行多列的结果。
运行后输出结果:
+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+ |bin1_value |bin1_count |bin2_value |bin2_count |bin3_value |bin3_count |bin4_value |bin4_count | +-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+ |a |19386 |b |14734 |c |12815 |d |4823 | +-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
内容的提问来源于stack exchange,提问作者TingL
相关产品推荐
相关产品推荐

