【问题标题】:Replace a part of a substring in a column using a dict使用 dict 替换列中子字符串的一部分
【发布时间】:2021-10-02 22:09:18
【问题描述】:

在 pyspark 中,我有一个包含 3 列的数据框,我想用字典中的值替换部分列值。如果整个列值是字典的一部分,df.replace 将替换 only,但我想替换列值的一部分中的值。例如:

id = [("val1","01-JAN-2021","01-MAR-2021"),
      ("val2","02-JUL-2021","01-AUG-2022"),
      ("val3","02-JUL-2021",None)]
df = spark.createDataFrame(id,["id","start_date","end_date"])
df = df.replace(date_dict, subset = ["start_date", "end_date"])

字典是:

date_dict = {"JAN": "Jan",
          "FEB" : "Feb",
          "MAR" : "Mar",
          "APR" : "Apr",
          "MAY" : "May",
          "JUN" : "Jun",
          "JUL" : "Jul",
          "AUG" : "Aug",
          "SEP" : "Sep",
          "OCT" : "Oct",
          "NOV" : "Nov",
          "DEC" : "Dec"}

我尝试了以下方法:

df = df.replace(date_dict, subset = ["start_date", "end_date"])

但它不会替换,因为列值是“01-JUN-2020”而不是“JUN”。知道如何实现这一目标吗?

【问题讨论】:

  • 您需要更换吗?为什么不将所有内容都转换为大写?

标签: python dataframe apache-spark pyspark replace


【解决方案1】:

恐怕在 PySpark 中没有实现的函数可以根据定义的字典替换字符串列的子字符串;您可能需要使用技巧。

例如,在这种情况下,您可以:

  • 感谢regexp_replace,用空格( )替换连字符(-
  • 使用initcap函数使句子中的所有单词都以大写字母开头
  • 将空格 ( ) 替换为连字符 (-) 以重建原始日期结构

代码

import pyspark.sql.functions as F

df = df\
  .withColumn('start_date', F.regexp_replace(F.initcap(F.regexp_replace('start_date', '-', ' ')), ' ', '-'))\
  .withColumn('end_date', F.regexp_replace(F.initcap(F.regexp_replace('end_date', '-', ' ')), ' ', '-'))

df.show()

+----+-----------+-----------+
|  id| start_date|   end_date|
+----+-----------+-----------+
|val1|01-Jan-2021|01-Mar-2021|
|val2|02-Jul-2021|01-Aug-2022|
|val3|02-Jul-2021|       null|
+----+-----------+-----------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 2014-06-03
    • 2017-01-06
    • 2020-03-08
    • 2019-09-26
    • 2023-03-20
    • 2014-05-31
    • 2019-08-08
    相关资源
    最近更新 更多