【发布时间】: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()。而是将'('和')'替换为''stackoverflow.com/questions/37038014/…
标签: python-3.x apache-spark pyspark apache-spark-sql