[英]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.