PySpark 从数据框列中删除前导 0,除非该值仅为 0
PySpark remove leading 0s from data frame column unless the value is just 0
(1) 00781 应该是 -> 781
(2) 00001 应该是 -> 1
(3) 00000 应该是 -> 0(对于这种特殊情况只有一个 0)
(4) 10101 应该是 -> 10101(不变)
我目前所掌握的是
from pyspark.sql import functions as F
df = df.withColumn('ID',F.regexp_replace('ID', r'^[0]*',''))
但这并不完全正确,因为它不适用于 00000 -> 0 的情况
from pyspark.sql.functions import col
from pyspark.sql.types import IntegerType
df = spark.createDataFrame([('01001',),('00056',),('00000',),('10101',)],['id'])
df.withColumn('new_id',col('id').cast(IntegerType())).show()
+-----+------+
| id|new_id|
+-----+------+
|01001| 1001|
|00056| 56|
|00000| 0|
|10101| 10101|
+-----+------+
我发现 regexp_extract
它更容易,尽管几乎肯定有办法 regexp_replace
。
df.withColumn('id2', f.regexp_extract(f.col('ID'), '^0*(([^0].*)|0$)', 1)).show()
+-----+-----+
| ID| id2|
+-----+-----+
|00781| 781|
|00001| 1|
|00000| 0|
|10101|10101|
+-----+-----+
该正则表达式仅针对从第一个非 0
开始的子字符串
或最后一个 0
(如果只有 0
)。
结果是
(1) 00781 应该是 -> 781
(2) 00001 应该是 -> 1
(3) 00000 应该是 -> 0(对于这种特殊情况只有一个 0)
(4) 10101 应该是 -> 10101(不变)
我目前所掌握的是
from pyspark.sql import functions as F
df = df.withColumn('ID',F.regexp_replace('ID', r'^[0]*',''))
但这并不完全正确,因为它不适用于 00000 -> 0 的情况
from pyspark.sql.functions import col
from pyspark.sql.types import IntegerType
df = spark.createDataFrame([('01001',),('00056',),('00000',),('10101',)],['id'])
df.withColumn('new_id',col('id').cast(IntegerType())).show()
+-----+------+
| id|new_id|
+-----+------+
|01001| 1001|
|00056| 56|
|00000| 0|
|10101| 10101|
+-----+------+
我发现 regexp_extract
它更容易,尽管几乎肯定有办法 regexp_replace
。
df.withColumn('id2', f.regexp_extract(f.col('ID'), '^0*(([^0].*)|0$)', 1)).show()
+-----+-----+
| ID| id2|
+-----+-----+
|00781| 781|
|00001| 1|
|00000| 0|
|10101|10101|
+-----+-----+
该正则表达式仅针对从第一个非 0
开始的子字符串
或最后一个 0
(如果只有 0
)。
结果是