python-3.x - 用负值替换负数的会计符号
问题描述
我有一个包含负数的数据框,带有会计符号,即:
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'), '(', ''))
)
解决方案
这可以通过 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 |
+---------+---------+
推荐阅读
- java - MySQL使用Java搜索数据
- java - 为什么 JSP 中的 cookie 对象只能包含 String 类型的值?
- fifo - 读取 FT2332H FIFO 数据
- python - 一次性导入所有子模块
- javascript - 使用 Nashorn 从 Java 中的 JavaScript 代码返回输出值
- django - 为什么它显示的空路径不匹配任何这些
- git - 在 git diff 中,区分删除和移动
- python-3.x - DataFrame.write.parquet() 只使用一个执行器,不扩展
- python - LSTM 文本生成 Input_shape
- python - 如何从用户输入中对文本文件执行搜索