python中的子字符串导致列objecct不可调用

问题描述 投票:0回答:2

我正在Pyspark上,创建了一个带有一些长型和十进制类型列的示例数据框。在这里,我想获取十进制类型的列值到两个小数点而不四舍五入。下面是我尝试过的代码。

df=spark.createDataframe(
[(324.456,hi,test),
(453.987,hello,python),
(768.66,test,java)],
["col1", "col2", "col3"])

new=df.withColumn("col4",F.substring((df.col1).cast(SringType()),1,F.instr((df.col1).cast(StringType()),".")+2))

所以在这里,我将列转换为字符串,并找到索引位置加两个(因为我需要两个小数点而不四舍五入)。但是我不是这里我得到“列”对象不是可调用错误的错误是什么。如果仅使用F.instr()函数,则工作正常。请协助其他解决方案,两个不取整就将值取到两位小数。

Expected output
col1     col2   col3   col4
324.456  hi     test   324.45
453.987  hello  python 453.98
768.66   test   java   768.66
python pyspark
2个回答
1
投票

您正在寻找一种截断小数的方法。我建议您为此使用pyspark.sql.functions.pow并巧妙地使用强制转换为LongType。这样,您将10^{decimal_places}乘以并再次除以相同的值,同时强制转换为long以消除介于两者之间的小数点(浮点数),例如:

df2.show()
+-------+-----+------+
|   col1| col2|  col3|
+-------+-----+------+
|324.456|   hi|  test|
|453.987|hello|python|
| 768.66| test|  java|
+-------+-----+------+


decimal_places = 2
truncated_value_column = f.pow(f.lit(10), decimal_places).cast('long')

df2.withColumn(
    "trunc", 
    ((f.col("col1") * truncated_value_column)).cast("long") / truncated_value_column
).show()
+-------+-----+------+------+
|   col1| col2|  col3| trunc|
+-------+-----+------+------+
|324.456|   hi|  test|324.45|
|453.987|hello|python|453.98|
| 768.66| test|  java|768.66|
+-------+-----+------+------+

注意:如果您随后希望回退至string,我建议您以后再回退。希望这会有所帮助!


0
投票

您还可以在此处将带有regexp_extract的正则表达式使用:

df.withColumn('test',F.regexp_extract(F.col("col1").cast("string"),'\d+.\d{2}',0)).show()

+-------+-----+------+------+
|   col1| col2|  col3|  test|
+-------+-----+------+------+
|324.456|   hi|  test|324.45|
|453.987|hello|python|453.98|
| 768.66| test|  java|768.66|
+-------+-----+------+------+
© www.soinside.com 2019 - 2024. All rights reserved.