【问题标题】:Pyspark change column value if value from list is in another column如果列表中的值在另一列中,则 Pyspark 更改列值
【发布时间】:2020-02-20 20:37:29
【问题描述】:

我有一个这样的数据框:

+-------+----------------+
|Name   |Source          |
+-------+----------------+
|Tom    |clientA-incoming|
|Dick   |clientB-incoming|
|Harry  |c-abc-incoming  |

我想添加一列 slug 来结束这个数据框:

+-------+----------------+--------+
|Name   |Source          |slug    |
+-------+----------------+--------+
|Tom    |clientA-incoming|clientA |
|Dick   |clientB-incoming|clientB |
|Harry  |c-abc-incoming  |c-abc   |

我有一个包含 slug 的值列表:

slugs = ['clientA', 'clientB', 'c-abc']

我基本上是按照这个伪代码的思路来思考的:

for i in slugs:
    if i in df['Source']:
        df['Slug'] = i

谁能帮我越过终点线?

编辑:

我想用slugs 列表中的值更新slug 列。进入slug 列的具体值是根据Source 列确定的。

例如,由于slugs[0] = 'clientA' 和clientA 是clientA-incoming 的子字符串,我想将slug 列中该行的值更新为clientA

【问题讨论】:

  • 所以大概你会有一些不在slugs 中的行并且它们的长度不同?
  • 你想根据Source 列填充slug 列吗?或来自slugs 列表..?
  • 每一行在slugs 中都有对应的值,但slugs 中的值会没有一行
  • @Shu 我想根据Source中的值使用列表slugs中的数据填充slug
  • 使用带有coalescecontains、(或startswith)和when 的列表组合来执行if-then-else 逻辑:类似于:df.withColumn('slug', coalesce(*[when(col('Source').contains(slug), lit(slug)) for slug in slugs]))

标签: python apache-spark pyspark aws-glue


【解决方案1】:

这可以根据您的要求使用左连接或内连接来解决:

from pyspark.sql.functions import broadcast

slugs = ['clientA', 'clientB', 'c-abc', 'f-gd']
sdf = spark.createDataFrame(slugs, "string").withColumnRenamed("value", "slug")

df = spark.createDataFrame([
  ["Tom", "clientA-incoming"],
  ["Dick", "clientB-incoming"],
  ["Harry", "c-abc-incoming"],
  ["Harry", "c-dgl-incoming"]
], ["Name", "Source"])

df.join(broadcast(sdf), df["Source"].contains(sdf["slug"]), "left").show()

# +-----+----------------+-------+
# | Name|          Source|   slug|
# +-----+----------------+-------+
# |  Tom|clientA-incoming|clientA|
# | Dick|clientB-incoming|clientB|
# |Harry|  c-abc-incoming|  c-abc|
# |Harry|  c-dgl-incoming|   null|
# +-----+----------------+-------+

请注意,我们广播较小的 df 以防止洗牌。

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多