如何将序列中的整行从小数转换为浮点数,删除缺失值或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'
答案 0 :(得分:1)
您应该查看Csv type provider和Csv file parser documentation。例如,您可以直接在Csv提供的类型上应用Filter
和Map
来转换数据。在这种情况下,您将直接操作该类型(而不是其Row
,例如在CsvFile.GetSample()上)。此外,csv文件解析更适合格式错误的数据。可以选择直接指定架构和类型,以及处理缺失值。
您当然可以过滤掉nan
并以通常的方式将float转换为十进制(这可以在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)]
我使用的数据:
身份证,国家,收入
40,TX,2000.1
48,MO,#N / A
15,TX,3000
78,TN,
41,VT,