我的 csv 文件有问题,其中包含“7,27431439586819e-05”这样的十进制值
spark.read.option("header", "true")\
.option("delimiter", ";")\
.option("locale", "fr-FR")\ *doesnt work...*
.option("inferSchema", "true")\
.csv("file.csv").toPandas()
逗号似乎不是标准逗号,我找不到指定符号的选项 (.option('decimal',',') 不存在,.option('locale','fr-FR')不起作用)
你有什么想法吗?我也尝试了 re.sub("[^0-9]", ".") 然后意识到我有科学价值('e-')所以它也不起作用。
尝试使用 pyspark 中的 regexp_replace() 函数将“,”替换为“.”然后转换为 DoubleType()。
import pandas as pd
import pyspark.sql.functions as F
from pyspark.sql.types import DoubleType
df = pd.DataFrame({"Name": ['a', 'b', 'c'], "Measures":["7,27431439586819e-05", "15,4689439586819e-01", "-2,97431439586819e02"]})
dfs = spark.createDataFrame(df)
dfs_transformed = dfs.withColumn('Measures', F.regexp_replace('Measures', ',', '.').cast(DoubleType()))
dfs_transformed.show()
您应该获得正确输入的值:
+----+-------------------+
|Name| Measures|
+----+-------------------+
| a|7.27431439586819E-5|
| b| 1.54689439586819|
| c| -297.431439586819|
+----+-------------------+
如果您手动指定模式并将该字段类型设置为
DecimalType(30, 15)
(例如 30 和 15),它就可以工作,但“e”必须很大,“E”。
这个csv:
id;value
a;7,27431439586819E-05
b;7,27431439586819E05
c;7,27431439586819E-02
加载此代码:
from pyspark.sql.types import *
schema = StructType(fields = [StructField("id", StringType()), StructField("value", DecimalType(25, 15))])
sdf = (ss.read.options(header=True, delimiter=';', locale="fr-FR")
.schema(schema)
.csv('test.csv').show(10, False)
)
正确阅读:
+---+----------------------+
|id |value |
+---+----------------------+
|a |0.000072743143959 |
|b |727431.439586819000000|
|c |0.072743143958682 |
+---+----------------------+