我有如下数据:
ID ID1 ID2
32336741 ["32361087"] ["36013040"]
32290433 ["32223150-32223653"] ["36003347-36003348"]
32299856 ["32361087","32299991","32223653"] ["36013040","36013029","36013040"]
在数据框中,我试图将逗号分隔的值分解为多行。 代码:
fulldf = (df
.withColumn('ID1',F.explode(F.split('ID1','-')))
.withColumn("ID1",F.regexp_replace("ID1", r"\[|\]|""\"", ""))
)
fulldf = fulldf.dropna()
fulldf.display()
结果:
ID ID1
32336741 36013040
32290433 36003347
32290433 36003348
32290825 36013045
32290825 36013046
32290825 36013338
但是当我在数据框语法中添加列 ID2 时,它会为我提供多个记录,例如双倍记录。
预期输出:
ID ID1 ID2
32336741 32361087 36013040
32290433 32223150 36003347
32290433 32223653 36003348
32290825 32361087 36013045
32290825 32299991 36013046
32290825 32223653 36013338
如果示例中显示的内容一致,则只需提取数字,而不是拆分等。
>>> df = spark.createDataFrame([
(32336741,'["32361087"]','["36013040"]'),
(32290433,'["32223150-32223653"]','["36003347-36003348"]'),
(32299856,'["32361087","32299991","32223653"]','["36013040","36013029","36013040"]'),
], schema='id: int, id1: string, id2: string')
>>> df.select(F.regexp_extract_all(df.id1, F.lit('(\d+)'))).show(truncate=False)
+---------------------------------+
|regexp_extract_all(id1, (\d+), 1)|
+---------------------------------+
|[32361087] |
|[32223150, 32223653] |
|[32361087, 32299991, 32223653] |
+---------------------------------+
>>> df.select(F.explode(F.regexp_extract_all(df.id1, F.lit('(\d+)'))).alias('id1_split')).show()
+---------+
|id1_split|
+---------+
| 32361087|
| 32223150|
| 32223653|
| 32361087|
| 32299991|
| 32223653|
+---------+
>>>
然后根据你想要的,你只需要加入/交叉加入原始 df 与这个分解的 df 就可以得到你想要的。