Julia中DataFrame导出CSV时去除类型信息的问题
如何在Julia中导出CSV时避免写入Pair类型信息,只保留纯数值格式?
问题描述
尝试将变量写入DataFrame并导出为CSV文件时,发现像x = 1.2345这样的简单变量会以Pair{Any, Any}("x", 1.234)的格式写入CSV,而非预期的纯数值。以下是相关代码:
using DataFrames using CSV function pushDbVals!(df,names,vals) if (length(names)!=length(vals)) error("length(names)!=length(vals): ", length(names),"!=", length(vals)) end row = [] for d in vals push!(row,d) end push!(df,row) end x = 1.234 dbNames = ["x"] vals = Dict() vals["x"] = x println("x: ", x) df = DataFrame([ name =>[] for name in dbNames]) pushDbVals!(df,dbNames,vals) CSV.write("test.csv", df)
希望导出的CSV为纯格式,不包含任何类型信息。
解决方案
问题出在pushDbVals!函数的遍历逻辑上:Julia中直接遍历Dict对象时,默认返回的是键值对(Pair类型),而非对应的值,这导致row数组中存储的是Pair,最终导出CSV时带上了类型信息。
修正方法1:按列名顺序提取对应值(推荐)
由于函数参数已经提供了列名列表names,可以直接按这个顺序从vals字典中提取对应的值,既保证数据顺序和列名匹配,又能得到纯数值:
using DataFrames using CSV function pushDbVals!(df, names, vals) if length(names) != length(vals) error("length(names)!=length(vals): ", length(names),"!=", length(vals)) end # 按列名顺序提取对应的值,生成纯数值数组 row = [vals[name] for name in names] push!(df, row) end x = 1.234 dbNames = ["x"] vals = Dict("x" => x) println("x: ", x) df = DataFrame([name => [] for name in dbNames]) pushDbVals!(df, dbNames, vals) CSV.write("test.csv", df)
修正方法2:遍历字典的值(注意顺序问题)
如果需要遍历字典的值,可以使用values(vals)来获取所有值的迭代器,但要注意Dict是无序容器,遍历得到的值顺序可能和names不匹配,仅在不关心顺序的场景下使用:
function pushDbVals!(df,names,vals) if (length(names)!=length(vals)) error("length(names)!=length(vals): ", length(names),"!=", length(vals)) end row = [] # 遍历字典的值而非键值对 for d in values(vals) push!(row,d) end push!(df,row) end
效果验证
修正后导出的test.csv内容将是纯数值格式:
x 1.234
内容的提问来源于stack exchange,提问作者Mike75
相关产品推荐
相关产品推荐

