我有一个像这样的数据框。 colA
包含项目列表,但它存储在像这样的引号下
data = [(("ID1", "['valA', 'valB']")), (("ID1", "[]")), (("ID1", "['valC']")), (("ID1", ""))]
df = spark.createDataFrame(data, ["ID", "colA"])
df.show()
+---+----------------+
| ID| colA|
+---+----------------+
|ID1|['valA', 'valB']|
|ID2| []|
|ID3| ['valC']|
|ID4| |
+---+----------------+
colA
具有空白和空列表值。
我想清理此列,以便我拥有以下 DataFrame
+---+------------+
| ID| colA|
+---+------------+
|ID1|[valA, valB]|
|ID2| null|
|ID3| [valC]|
|ID4| null|
+---+------------+
最佳答案
步骤:
- 删除开始
^['
或|
结束']$
括号。\
用于转义,^
用于字符串开头,$
用于字符串结尾 - 将空列表
[]
转换为空字符串,再次使用\
转义 - 删除空字符串
- 通过
'、'
或','
分割来分隔元素,?
表示可选空格
代码
from pyspark.sql import functions as f
data = [(("ID1", "['valA', 'valB']")), (("ID1", "[]")), (("ID1", "['valC']")), (("ID1", ""))]
df = spark.createDataFrame(data, ["ID", "colA"])
df_2 \
.withColumn('colA_2', f.regexp_replace('colA', "^\['|'\]$", '')) \
.withColumn('colA_2', f.regexp_replace('colA_2', "\[\]", '')) \
.withColumn('colA_2', f.when(f.col('colA_2') == "", None).otherwise(f.col('colA_2'))) \
.withColumn('colA_2', f.split('colA_2', "', ?'"))
输出
df_2.show()
+---+----------------+------------+
| ID| colA| colA_2|
+---+----------------+------------+
|ID1|['valA', 'valB']|[valA, valB]|
|ID1| []| null|
|ID1| ['valC']| [valC]|
|ID1| | null|
+---+----------------+------------+
df_2.printSchema()
root
|-- ID: string (nullable = true)
|-- colA: string (nullable = true)
|-- colA_2: array (nullable = true)
| |-- element: string (containsNull = true)
关于python - 删除pyspark列表中的单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57603538/