Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dataframe regexp_从类似字符串的数组中提取值_Python_Apache Spark_Pyspark_Apache Spark Sql_Pyspark Dataframes - Fatal编程技术网

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 |
#+---------+---+----+-----+---+