用负值替换负数的会计符号
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
您可以遍历所有元素并应用此功能。
【讨论】:
以上是关于用负值替换负数的会计符号的主要内容,如果未能解决你的问题,请参考以下文章