Python Dataframe regexp_从类似字符串的数组中提取值
我的数据框如下所示:Python Dataframe regexp_从类似字符串的数组中提取值,python,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我的数据框如下所示: StudentID Marks 100 ["20", "25.5", "40.23", "50"] 200 ["30", "20", "25", "40"] 300 ["20", "25", "50", "35"] 我需要提取数组中的标记,并创建一个新的数据帧。但是,我无法提取DF中超过第二个值的标记(不知道如何通过正则表达式([0-9]+)(?:\.[0-9]+)
StudentID Marks
100 ["20", "25.5", "40.23", "50"]
200 ["30", "20", "25", "40"]
300 ["20", "25", "50", "35"]
我需要提取数组中的标记
,并创建一个新的数据帧。但是,我无法提取DF中超过第二个值的标记(不知道如何通过正则表达式([0-9]+)(?:\.[0-9]+){3}
)
df1.select(regexp_extract('StudentID', '(\w+)(,)', 1).alias("C1"),
regexp_extract('Marks', '([0-9]+)(?:\.[0-9]+){3}', 0).alias("C2"))
最终,需要创建具有以下格式的新数据帧:
StudentID C1 C2 C3 C4
100 20 25.5 40.23 50
200 30 20 25 40
300 20 25 50 35
提前谢谢。您可以拆分字符串,然后使用
处的元素\u将子字符串拉入单独的列中:
df1.withColumn("marks_array", split( regexp_replace(col("Marks"), "\\[|\\]|\"", ""), ",") )
.withColumn("C1", element_at(col("marks_array"), 1))
.withColumn("C2", element_at(col("marks_array"), 2))
.withColumn("C3", element_at(col("marks_array"), 3))
.withColumn("C4", element_at(col("marks_array"), 4))
.drop("marks_array", "Marks")
.show(false)
可以使用将字符串列标记
转换为字符串数组。然后获取数组元素以创建每个列
但是,如果不知道数组的大小,可以使用函数将其转换为贴图,然后分解贴图和轴以获得所需的输出
transform_expr = """transform(from_json(Marks, 'array<string>'),
(x, i) -> struct(concat('C', i+1), x)
)
"""
df.select(col("*"), explode(map_from_entries(expr(transform_expr)))) \
.groupBy("StudentID").pivot("key").agg(first("value")) \
.show()
#+---------+---+----+-----+---+
#|StudentID|C1 |C2 |C3 |C4 |
#+---------+---+----+-----+---+
#|100 |20 |25.5|40.23|50 |
#|200 |30 |20 |25 |40 |
#|300 |20 |25 |50 |35 |
#+---------+---+----+-----+---+
transform_expr=“”transform(来自_json(标记,'array'),
(x,i)->struct(concat('C',i+1),x)
)
"""
df.select(col(“*”),explode(映射\u-from\u条目(expr(transform\u-expr)))\
.groupBy(“StudentID”).pivot(“key”).agg(第一个(“值”))\
.show()
#+---------+---+----+-----+---+
#|学生ID | C1 | C2 | C3 | C4|
#+---------+---+----+-----+---+
#|100 |20 |25.5|40.23|50 |
#|200 |30 |20 |25 |40 |
#|300 |20 |25 |50 |35 |
#+---------+---+----+-----+---+
注:transfrom
和map\u from\u条目
功能仅适用于Spark 2.4+标记
的数据类型是什么?字符串?@ernest\u k-是,其字符串类型
transform_expr = """transform(from_json(Marks, 'array<string>'),
(x, i) -> struct(concat('C', i+1), x)
)
"""
df.select(col("*"), explode(map_from_entries(expr(transform_expr)))) \
.groupBy("StudentID").pivot("key").agg(first("value")) \
.show()
#+---------+---+----+-----+---+
#|StudentID|C1 |C2 |C3 |C4 |
#+---------+---+----+-----+---+
#|100 |20 |25.5|40.23|50 |
#|200 |30 |20 |25 |40 |
#|300 |20 |25 |50 |35 |
#+---------+---+----+-----+---+