在 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] 删除。
我来说两句