我试图在pyspark数据框架中拆分列的值。考虑柱大小具有诸如"15ML","20GM"等值。我希望它们以这样一种方式分裂,分裂后的输出值变成"15 ML"one_answers"20 GM"。基本上,我试着把数值和它的单位分开。请帮我证明一个解决这个问题的方法。
+--------------+-------------------------+
|size |new_size(after splitting)|
+--------------+-------------------------+
| 100MG| 100 MG|
| 1EA| 1 EA|
| 100MG| 100 MG|
+--------------+-------------------------+
我已经插入了示例数据和我需要的最终列格式。提前感谢
我尝试使用下面的代码,但我没有得到正确的结果。
from pyspark.sql.functions import split
df_f = products_size_df.withColumn("new_size", split(products_size_df.size, "MG"))
如果你只想在value和它的单位之间添加空格,你可以像这样使用regexp_replace
:
products_size_df.withColumn("new_size", regexp_replace(products_size_df.size, '(d+)', '$1 '))
$1指的是组的个数,所以基本上你只需要找到值并在它后面加上空格
如果您需要为值和单位创建新的列,您可以像这样取regexp_extract
:
products_size_df.withColumn("new_value", regexp_extract(products_size_df.size, '(d*)', 1))
products_size_df.withColumn("new_unit", regexp_extract(products_size_df.size, '([A-Za-z]+)', 1))
请注意,如果没有找到group,它将返回空字符串而不是NULL,并且只有当column本身具有NULL值时才返回NULL
可以使用udf分隔字符串中的数字和字母字符:
import re
spark = SparkSession.builder.master("local[*]").getOrCreate()
data = [["100MG"], ["1EA"], ["100MG"]]
df = spark.createDataFrame(data).toDF("size")
def split_func(str):
return re.sub("[A-Za-z]+", lambda ele: " " + ele[0] + " ", str)
split_udf = udf(split_func)
df.withColumn("splitted", split_udf(col("size"))).show()
+-----+--------+
| size|splitted|
+-----+--------+
|100MG| 100 MG |
| 1EA| 1 EA |
|100MG| 100 MG |
+-----+--------+