在 Julia 中将 Dict 转换为 DataFrame
Convert Dict to DataFrame in Julia
假设我有一个Dict
定义如下:
x = Dict{AbstractString,Array{Integer,1}}("A" => [1,2,3], "B" => [4,5,6])
我想将其转换为 DataFrame
对象(来自 DataFrames
模块)。构造 DataFrame
的语法与构造字典类似。例如,上面的字典可以手动构建为数据框,如下所示:
DataFrame(A = [1,2,3], B = [4,5,6])
我还没有找到从字典到数据框的直接方法,但我认为可以利用句法相似性并编写一个宏来执行此操作。以下根本不起作用,但它说明了我想到的方法:
macro dict_to_df(x)
typeof(eval(x)) <: Dict || throw(ArgumentError("Expected Dict"))
return quote
DataFrame(
for k in keys(eval(x))
@eval ($k) = $(eval(x)[$k])
end
)
end
end
我也试过把它写成一个函数,当所有字典值都具有相同的长度时它确实有效:
function dict_to_df(x::Dict)
s = "DataFrame("
for k in keys(x)
v = x[k]
if typeof(v) <: AbstractString
v = string('"', v, '"')
end
s *= "$(k) = $(v),"
end
s = chop(s) * ")"
return eval(parse(s))
end
是否有更好、更快或更惯用的方法?
另一种方法可能是
DataFrame(Any[values(x)...],Symbol[map(symbol,keys(x))...])
获取类型以访问正确的构造函数有点棘手。为了获得 DataFrame
s 的构造函数列表,我使用了 methods(DataFrame)
.
创建 DataFrame 的 DataFrame(a=[1,2,3])
方法使用关键字参数。要对关键字参数使用 splatting (...
),键必须是符号。在示例中 x
有字符串,但这些可以转换为符号。在代码中,这是:
DataFrame(;[Symbol(k)=>v for (k,v) in x]...)
最后,如果 x
最初使用符号,事情会更清晰。然后代码会是:
x = Dict{Symbol,Array{Integer,1}}(:A => [1,2,3], :B => [4,5,6])
df = DataFrame(;x...)
假设我有一个Dict
定义如下:
x = Dict{AbstractString,Array{Integer,1}}("A" => [1,2,3], "B" => [4,5,6])
我想将其转换为 DataFrame
对象(来自 DataFrames
模块)。构造 DataFrame
的语法与构造字典类似。例如,上面的字典可以手动构建为数据框,如下所示:
DataFrame(A = [1,2,3], B = [4,5,6])
我还没有找到从字典到数据框的直接方法,但我认为可以利用句法相似性并编写一个宏来执行此操作。以下根本不起作用,但它说明了我想到的方法:
macro dict_to_df(x)
typeof(eval(x)) <: Dict || throw(ArgumentError("Expected Dict"))
return quote
DataFrame(
for k in keys(eval(x))
@eval ($k) = $(eval(x)[$k])
end
)
end
end
我也试过把它写成一个函数,当所有字典值都具有相同的长度时它确实有效:
function dict_to_df(x::Dict)
s = "DataFrame("
for k in keys(x)
v = x[k]
if typeof(v) <: AbstractString
v = string('"', v, '"')
end
s *= "$(k) = $(v),"
end
s = chop(s) * ")"
return eval(parse(s))
end
是否有更好、更快或更惯用的方法?
另一种方法可能是
DataFrame(Any[values(x)...],Symbol[map(symbol,keys(x))...])
获取类型以访问正确的构造函数有点棘手。为了获得 DataFrame
s 的构造函数列表,我使用了 methods(DataFrame)
.
创建 DataFrame 的 DataFrame(a=[1,2,3])
方法使用关键字参数。要对关键字参数使用 splatting (...
),键必须是符号。在示例中 x
有字符串,但这些可以转换为符号。在代码中,这是:
DataFrame(;[Symbol(k)=>v for (k,v) in x]...)
最后,如果 x
最初使用符号,事情会更清晰。然后代码会是:
x = Dict{Symbol,Array{Integer,1}}(:A => [1,2,3], :B => [4,5,6])
df = DataFrame(;x...)