使用字典替换列中子字符串的一部分

软件开发商

在 pyspark 中,我有一个包含 3 列的数据框,我想用字典中的值替换部分列值。df.replace当整个列值是字典的一部分时才会替换,但我想从列值的一部分替换该值。例如:

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”。知道如何实现这一目标吗?

瑞克

恐怕在 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|
+----+-----------+-----------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章