[英]PySpark Dataframe transform columns into rows
我有以下数据框
REC_DATA = spark.createDataFrame(
[
('exercise', 'fiber', 'rice', 'male'),
('exercise', 'rice', 'fiber', 'female'),
('exercise', 'water', 'fiber', 'male'),
('exercise', 'rice', 'exercise', 'female'),
],
StructType(
[
StructField("1_rec", StringType(), False),
StructField("2_rec", StringType(), False),
StructField("3_rec", StringType(), False),
StructField("sex", StringType(), True),
]
)
)
1_rec | 2_rec | 3_rec | 性别 |
---|---|---|---|
锻炼 | 纤维 | 白饭 | 男性 |
锻炼 | 白饭 | 纤维 | 女性 |
锻炼 | 水 | 纤维 | 男性 |
水 | 白饭 | 锻炼 | 女性 |
我试图将这些行分组到一个新列中,将列 1_rec、2_rec、3_rec 转换为行,并添加一个带有数量的新列,输出应该是这样的:
位置 | 名称 | 数数 |
---|---|---|
1_rec | 锻炼 | 3 |
1_rec | 水 | 1 |
2_rec | 水 | 1 |
2_rec | 白饭 | 2 |
2_rec | 纤维 | 1 |
3_rec | 白饭 | 1 |
3_rec | 纤维 | 2 |
3_rec | 锻炼 | 1 |
我曾尝试做一个交叉表,但它没有正常工作。
使用stack
对逆透视列进行排序,然后按位置和名称对它们进行分组
import pyspark.sql.functions as F
REC_DATA = (REC_DATA
.selectExpr("stack(3, '1_rec', 1_rec, '2_rec', 2_rec, '3_rec', 3_rec) (position, name)")
.groupBy('position', 'name')
.agg(F.count("*").alias('count')))
REC_DATA.show()
+--------+--------+-----+
|position| name|count|
+--------+--------+-----+
| 1_rec| water| 1|
| 2_rec| rice| 2|
| 3_rec|exercise| 1|
| 3_rec| fiber| 2|
| 2_rec| water| 1|
| 3_rec| rice| 1|
| 1_rec|exercise| 3|
| 2_rec| fiber| 1|
+--------+--------+-----+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.