如何将序列中的整行从十进制数转换为浮点数,删除缺失值或 nan 值,然后在同一函数中将这些相同的值全部转换回小数。
有什么建议么?
行是指您在从 CSV 提供程序创建类型时选择的行。
type IncomeCsv = CsvProvider<IncomeCsvFile>
IncomeCsv.GetSample().Rows
|> Seq.filter (fun row -> row.State = "TX")
|> List.ofSeq
对于 TX 的一项观察,我得到了这些值:
[(TX, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan)]
这是一个 SEQUENCE 中许多人观察到的一个例子。我需要使用上述函数过滤掉这个特定的观察结果。
我曾尝试使用 Double.Is.NaN,但由于某种原因它不起作用。
|> Seq.filter (fun element -> not (Double.IsNaN element))
我收到此错误:
Practice2.fsx(39,53): error FS0001: This expression was expected to have
type
'float'
but here has type
'CsvProvider<...>.Row'
您应该查看Csv 类型提供程序和Csv 文件解析器文档。例如,您可以直接在 Csv 提供的类型上应用Filter
和Map
来转换您的数据。在这种情况下,您将直接对类型进行操作(而不是它的Row
,例如在 CsvFile.GetSample() 上)。此外,csv 文件解析更适合格式错误的数据。可能有选项可以直接指定架构和类型,以及处理缺失值。
您当然也可以nan
以通常的方式过滤掉浮点数并将其转换为十进制(这在 CsvProvider.Row 上运行):
data
|> Seq.filter (fun x -> not (Double.IsNaN(x.Income)))
|> Seq.map (fun x -> (x.Id, x.State, decimal x.Income))
//val it : seq<int * string * decimal> =seq [(40, "TX", 2000.1M); (15, "TX", 3000M)]
我使用的数据:
Id,State,Income
40,TX,2000.1
48,MO,#N/A
15,TX,3000
78,TN,
41,VT,
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句