String 替换pyspark数据帧中字符串的子字符串

String 替换pyspark数据帧中字符串的子字符串,string,dataframe,replace,pyspark,String,Dataframe,Replace,Pyspark,如何替换字符串的子字符串。例如,我创建了一个基于以下json格式的数据帧 line1:{"F":{"P3":"1:0.01","P8":"3:0.03,4:0.04", ...},"I":"blah"} line2:{"F":{"P4":"2:0.01,3:0.02","P10":"5:0.02", ...},"I":"blah"} 我需要将子字符串“1:”、“2:”、“3:”,替换为“a:”、“b:”、“c:”,等等。因此结果将是: line1:{"F":{"P3":"a:0.01","P8

如何替换字符串的子字符串。例如,我创建了一个基于以下json格式的数据帧

line1:{"F":{"P3":"1:0.01","P8":"3:0.03,4:0.04", ...},"I":"blah"}
line2:{"F":{"P4":"2:0.01,3:0.02","P10":"5:0.02", ...},"I":"blah"}
我需要将子字符串“1:”、“2:”、“3:”,替换为“a:”、“b:”、“c:”,等等。因此结果将是:

line1:{"F":{"P3":"a:0.01","P8":"c:0.03,d:0.04", ...},"I":"blah"}
line2:{"F":{"P4":"b:0.01,c:0.02","P10":"e:0.02", ...},"I":"blah"}

请考虑这只是一个例子,真正的替换是子字符串替换而不是字符替换。 Scala或Pyspark中的任何指导都是有用的

from pyspark.sql.functions import *       
newDf = df.withColumn('col_name', regexp_replace('col_name', '1:', 'a:'))
详情如下:

详情如下:

假设您有一组字符串可供修改(本例简化)

你有一本字典,里面有必要的转换

val num2name = Map("1" -> "A"
                  ,"2" -> "Bo"
                  ,"3" -> "Cy"
                  ,"4" -> "Dee")
从这里可以使用
replaceSomeIn()
进行替换

data.map("(\\d+):".r  //note: Map key is only part of the match pattern
                  .replaceSomeIn(_, m => num2name.get(m group 1)  //get replacement
                                                 .map(_ + ":")))  //restore ":"
//res0: Seq[String] = List(A:0.01
//                        ,Cy:0.03,Dee:0.04
//                        ,Bo:0.01,Cy:0.02
//                        ,5:0.02)

如您所见,
“5:”
与regex模式匹配,但由于
5
部分未在
num2name
中定义,因此字符串保持不变。

假设您有一组字符串可供修改(本例简化)

你有一本字典,里面有必要的转换

val num2name = Map("1" -> "A"
                  ,"2" -> "Bo"
                  ,"3" -> "Cy"
                  ,"4" -> "Dee")
从这里可以使用
replaceSomeIn()
进行替换

data.map("(\\d+):".r  //note: Map key is only part of the match pattern
                  .replaceSomeIn(_, m => num2name.get(m group 1)  //get replacement
                                                 .map(_ + ":")))  //restore ":"
//res0: Seq[String] = List(A:0.01
//                        ,Cy:0.03,Dee:0.04
//                        ,Bo:0.01,Cy:0.02
//                        ,5:0.02)

如您所见,
“5:”
与regex模式匹配,但由于
5
部分未在
num2name
中定义,因此字符串保持不变。

这是我在PySpark中解决它的方法:

def _blahblah_name_replacement(val, ordered_mapping):
    for key, value in ordered_mapping.items():
        val = val.replace(key, value)
    return val

mapping = {"1:":"aaa:", "2:":"bbb:", ..., "24:":"xxx:", "25:":"yyy:", ....}
ordered_mapping = OrderedDict(reversed(sorted(mapping.items(), key=lambda t: int(t[0][:-1]))))
replacing = udf(lambda x: _blahblah_name_replacement(x, ordered_mapping))
new_df = df.withColumn("F", replacing(col("F")))

这是我在PySpark中解决问题的方法:

def _blahblah_name_replacement(val, ordered_mapping):
    for key, value in ordered_mapping.items():
        val = val.replace(key, value)
    return val

mapping = {"1:":"aaa:", "2:":"bbb:", ..., "24:":"xxx:", "25:":"yyy:", ....}
ordered_mapping = OrderedDict(reversed(sorted(mapping.items(), key=lambda t: int(t[0][:-1]))))
replacing = udf(lambda x: _blahblah_name_replacement(x, ordered_mapping))
new_df = df.withColumn("F", replacing(col("F")))

谢谢你的指导,我正在寻找的东西,做所有的更换一次。例如,基于一个映射(字典),将所有键替换为值==>为“1:”到“a:”,“2:”到“b:”,等等。此解决方案是局部的,链接中的解决方案将正常工作。唯一的问题是它不能完全解决这个问题。正如我的问题所示,转换为dataframe后的json文件将有两列“I”和“F”,其中“F”数据类型是一个结构,当我尝试在共享链接中使用解决方案时,由于数据类型不匹配,会出现错误,因为它查找字符串,但列“F”数据类型不是字符串。感谢您的指导,我正在寻找的东西,做所有的更换一次。例如,基于一个映射(字典),将所有键替换为值==>为“1:”到“a:”,“2:”到“b:”,等等。此解决方案是局部的,链接中的解决方案将正常工作。唯一的问题是它不能完全解决这个问题。正如我的问题所示,转换为数据帧后的json文件将有两列“I”和“F”,其中“F”数据类型是一个结构,当我尝试在共享链接中使用解决方案时,由于数据类型不匹配,会出现错误,因为它查找字符串,但列“F”数据类型不是字符串。哦,对不起,我认为我的解释很混乱。我只想替换字符串中“:”之后的数字。基本上,P1,P2。。。Pn是键,我不想替换键或更改它们的名称。我只想将值==>“1:”中的字符串替换为“a:”,“2:”替换为“b:”等等。
1:
替换为
a:
,以及
2:
替换为
b:
,以及
27:
替换为…?是的,类似于这样的东西。像什么?如何翻译
27
32521
是如何翻译的?因此“:”之前的整个字符串将替换为新字符串。“1:”到“hello\u word:”,“2:”到“另一个hello\u word”,。。。“27:”到“你好”,“50:”到“我好”。假设你有一个字典(地图),可以把数字映射成字符串,地图的大小可以改变,这是不必要的。。。我想用它的值来替换这个数字(作为字典中的键),它可以是我给出的例子之一。所以它不一定是27个数字,但它可以是更高的数字,它可以随时间变化。。。我的意思是地图可以改变,也可以改变它的大小。哦,对不起,我觉得我的解释很混乱。我只想替换字符串中“:”之后的数字。基本上,P1,P2。。。Pn是键,我不想替换键或更改它们的名称。我只想将值==>“1:”中的字符串替换为“a:”,“2:”替换为“b:”等等。
1:
替换为
a:
,以及
2:
替换为
b:
,以及
27:
替换为…?是的,类似于这样的东西。像什么?如何翻译
27
32521
是如何翻译的?因此“:”之前的整个字符串将替换为新字符串。“1:”到“hello\u word:”,“2:”到“另一个hello\u word”,。。。“27:”到“你好”,“50:”到“我好”。假设你有一个字典(地图),可以把数字映射成字符串,地图的大小可以改变,这是不必要的。。。我想用它的值来替换这个数字(作为字典中的键),它可以是我给出的例子之一。所以它不一定是27个数字,但它可以是更高的数字,它可以随时间变化。。。我的意思是地图可以改变,也可以改变它的大小。谢谢你的回复。你知道怎么用pyspark做吗?pyspark中“replaceSomeIn”的对应功能是什么?谢谢您的回复。你知道怎么用pyspark做吗?pyspark中“replaceSomeIn”的对应函数是什么?