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)。

结果是