LinearAlgebra.Transpose非表格类型错误:Julia代码问题排查
问题解决:Julia中Transpose类型无法直接构造DataFrame的错误
错误原因
你遇到的ArgumentError是因为transpose(a[:,1:3])返回的是LinearAlgebra.Transpose类型,该类型不属于DataFrames.jl能直接识别的表格类型,直接传入DataFrame()构造函数会触发类型不兼容报错。
解决方案
有两种简单的修复方式:
方式1:将Transpose转换为普通矩阵
用Matrix()包裹transpose(a[:,1:3]),转换成标准矩阵类型后再构造DataFrame:
function price_zones(a::Array{Float64,2}) # 将Transpose转为普通矩阵后构造DataFrame df_temp = DataFrame(Matrix(transpose(a[:,1:3]))) v_temp = vec(convert(Array, mapcols!(count_unique, df_temp))) df = DataFrame(OnePriceZone = sum(v_temp .== 1), TwoPriceZones = sum(v_temp .== 2), ThreePriceZones = sum(v_temp .== 3)) return df end
方式2:用Tables.table包装Transpose对象
导入Tables包后,用Tables.table()将Transpose对象转换为表格兼容类型,再传入DataFrame构造函数:
using Tables function price_zones(a::Array{Float64,2}) # 用Tables.table包装Transpose对象 df_temp = DataFrame(Tables.table(transpose(a[:,1:3]))) v_temp = vec(convert(Array, mapcols!(count_unique, df_temp))) df = DataFrame(OnePriceZone = sum(v_temp .== 1), TwoPriceZones = sum(v_temp .== 2), ThreePriceZones = sum(v_temp .== 3)) return df end
额外优化提示
如果不需要保留临时DataFrame,可以简化代码,直接在mapcols!前完成类型转换:
function price_zones(a::Array{Float64,2}) v_temp = vec(convert(Array, mapcols!(count_unique, DataFrame(Matrix(transpose(a[:,1:3])))))) df = DataFrame(OnePriceZone = sum(v_temp .== 1), TwoPriceZones = sum(v_temp .== 2), ThreePriceZones = sum(v_temp .== 3)) return df end
内容的提问来源于stack exchange,提问作者Asham Khan
相关产品推荐
相关产品推荐

