用负值替换负数的会计符号

Posted

技术标签:

【中文标题】用负值替换负数的会计符号【英文标题】:Replace accounting notation for negative number with minus value 【发布时间】:2021-06-22 15:54:19 【问题描述】:

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

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'), '(', ''))
)

【问题讨论】:

请使用tour、阅读what's on-topic here、How to Ask和question checklist,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。你必须诚实地尝试,然后就你的算法或技术提出一个具体问题。另见How to make good reproducible pandas examples 我的方法是在以( 开头的行前添加-,然后同时删除(),但不认为这是一个理想的方法 对我来说似乎很合理。为什么你不认为它是理想的? Edit a minimal reproducible example 进入您的问题并提出您似乎在问的具体问题:“这种方法对我没有好处,因为......以及如何改进它以实现...... 。” 因为我已经将值硬编码到 substr() 中,这意味着如果 sales 的长度与预期不同,则输出将变得不正确。这现在在问题中可见 所以不要使用substr()。而是将 '('')' 替换为 '' ***.com/questions/37038014/… 【参考方案1】:

这可以通过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       |
+---------+---------+

【讨论】:

【参考方案2】:

可以将字符串从倒数第二个字符切分,然后转换为浮点数,例如:

def convert(number):
    try:
        number = float(number)
    except:
        
        number = number[1:-1]
        number = float(number)
        return number

您可以遍历所有元素并应用此功能。

【讨论】:

以上是关于用负值替换负数的会计符号的主要内容,如果未能解决你的问题,请参考以下文章

sap中借方为啥用s

学会计用macbook好吗?

会计的适当数字格式是啥?

用友如何删除会计科目

会计科目错误怎么修改

PDF编辑删除替换某页面或文字