分解Pyspark DataFram中的行

2024-06-12 20:13:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Pypark数据帧,格式如下:

 dbn      |       bus      | subway   | score
----------|----------------|----------|--------
XYZ12     | B1, B44, B66   | A, C     | 59
ZYY3      | B8, B3, B7     | J, Z     | 66

我想做的是能够附加到每一个单独的巴士和地铁线路的得分列,但我想一次一列,所以我将从巴士开始。最终,我希望我的数据帧是这样的(当我处理总线列时)

dbn      | bus       | subway  | score
---------|-----------|---------|-------
XYZ12    | B1        | A, C    | 59
XYZ12    | B44       | A, C    | 59
XYZ12    | B66       | A, C    | 59
ZYY3     | B8        | J, Z    | 66
ZYY3     | B3        | J, Z    | 66
ZYY3     | B7        | J, Z    | 66

我该怎么做呢?你知道吗


Tags: 数据格式b1b3scoresubwaybusb7
1条回答
网友
1楼 · 发布于 2024-06-12 20:13:39

可以使用explode函数,该函数需要arraymap列作为输入。如果bus是一个字符串,那么可以使用字符串处理函数,比如split,首先将它分解为多个部分。假设这个场景:

df = sc.parallelize([
    ("XYZ12", "B1, B44, B66", "A, C", 59),
    ("ZYY3 ", "B8, B3, B7", "J, Z", 66)
]).toDF(["dbn", "bus", "subway", "score"])

首次导入所需函数:

from pyspark.sql.functions import col, explode, split, trim

添加列:

with_bus_exploded = df.withColumn("bus", explode(split("bus", ",")))

trim前导/尾随空格:

with_bus_trimmed = with_bus_exploded.withColumn("bus", trim(col("bus")))

最后的结果是:

+  -+ -+   +  -+
|  dbn|bus|subway|score|
+  -+ -+   +  -+
|XYZ12| B1|  A, C|   59|
|XYZ12|B44|  A, C|   59|
|XYZ12|B66|  A, C|   59|
|ZYY3 | B8|  J, Z|   66|
|ZYY3 | B3|  J, Z|   66|
|ZYY3 | B7|  J, Z|   66|
+  -+ -+   +  -+

相关问题 更多 >