首页 > 解决方案 > 用负值替换负数的会计符号

问题描述

我有一个包含负数的数据框,带有会计符号,即:

df.select('sales').distinct().show()

+------------+
|    sales   |
+------------+
|         18 |
|          3 |
|         10 |
|         (5)|
|          4 |
|         40 |
|          0 |
|          8 |
|         16 |
|         (2)|
|          2 |
|         (1)|
|         14 |
|         (3)|
|          9 |
|         19 |
|         (6)|
|          1 |
|         (9)|
|         (4)|
+------------+
only showing top 20 rows

包裹的数字()是负数。我怎样才能将它们替换为负值,而不是(5)变成-5等等。


这是我尝试过的:

sales = (
    df
    .select('sales')
    .withColumn('sales_new',
               sf.when(sf.col('sales').substr(1,1) == '(',
                       sf.concat(sf.lit('-'), sf.col('sales').substr(2,3)))
               .otherwise(sf.col('sales')))
    
)

sales.show(20,False)

+---------+---------+
|salees   |sales_new|
+---------+---------+
| 151     | 151     |
| 134     | 134     |
| 151     | 151     |
|(151)    |-151     |
|(134)    |-134     |
|(151)    |-151     |
| 151     | 151     |
| 50      | 50      |
| 101     | 101     |
| 134     | 134     |
|(134)    |-134     |
| 46      | 46      |
| 151     | 151     |
| 134     | 134     |
| 185     | 185     |
| 84      | 84      |
| 188     | 188     |
|(94)     |-94)     |
| 38      | 38      |
| 21      | 21      |
+---------+---------+

问题是销售的长度可能会有所不同,因此在某些情况下将值硬编码到 substring() 中是行不通的。


我曾尝试使用regexp_replace但得到一个错误:

PatternSyntaxException:索引 1 附近的未闭合组

sales = (
    df
    .select('sales')
    .withColumn('sales_new', regexp_replace(sf.col('sales'), '(', ''))
)

标签: python-3.xapache-sparkpysparkapache-spark-sql

解决方案


这可以通过 case 语句和正则表达式一起解决:

from pyspark.sql.functions import regexp_replace, col

sales = (
    df
    .select('sales')
    .withColumn('sales_new', sf.when(sf.col('sales').substr(1,1) == '(',
                sf.concat(sf.lit('-'), regexp_replace(sf.col('sales'), '\(|\)', '')))
                .otherwise(sf.col('sales')))
)

sales.show(20,False)

+---------+---------+
|sales    |sales_new|
+---------+---------+
|151      |151      |
|134      |134      |
|151      |151      |
|(151)    |-151     |
|(134)    |-134     |
|(151)    |-151     |
|151      |151      |
|50       |50       |
|101      |101      |
|134      |134      |
|(134)    |-134     |
|46       |46       |
|151      |151      |
|134      |134      |
|185      |185      |
|84       |84       |
|188      |188      |
|(94)     |-94      |
|38       |38       |
|21       |21       |
+---------+---------+

推荐阅读