W4t3randWind
W4t3randWind

Reputation: 653

Convert Julia array to dataframe

I have an array X that I'd like to convert to a dataframe. Upon recommendation from the web, I tried converting to a dataframe and get the following error.

julia> y=convert(DataFrame,x) ERROR:converthas no method matching convert(::Type{DataFrame}, ::Array{Float64,2}) in convert at base.jl:13

When I try DataFrame(x), the conversion works but i get a complaint that the conversion is deprecated.

julia> DataFrame(x) WARNING: DataFrame(::Matrix, ::Vector)) is deprecated, use convert(DataFrame, Matrix) instead in DataFrame at /Users/Matthew/.julia/v0.3/DataFrames/src/deprecated.jl:54 (repeats 2 times)

Is there another method I should be aware of to keep my code consistent?

EDIT: Julia 0.3.2, DataFrames 0.5.10 OSX 10.9.5

julia> x=rand(4,4)
4x4 Array{Float64,2}:
 0.467882   0.466358  0.28144   0.0151388
 0.22354    0.358616  0.669564  0.828768
 0.475064   0.187992  0.584741  0.0543435
 0.0592643  0.345138  0.704496  0.844822

julia> convert(DataFrame,x)
ERROR: `convert` has no method matching convert(::Type{DataFrame}, ::Array{Float64,2}) in convert at base.jl:13

Upvotes: 11

Views: 24477

Answers (7)

colebrookson
colebrookson

Reputation: 907

Since this is the first thing that comes up when you google, for more recent versions of DataFrames.jl, you can just use the DataFrame() function now:

julia> x = rand(4,4)
4×4 Matrix{Float64}:
 0.920406  0.738911  0.994401  0.9954
 0.18791   0.845132  0.277577  0.231483
 0.361269  0.918367  0.793115  0.988914
 0.725052  0.962762  0.413111  0.328261

julia> DataFrame(x, :auto)
4×4 DataFrame
 Row │ x1        x2        x3        x4       
     │ Float64   Float64   Float64   Float64  
─────┼────────────────────────────────────────
   1 │ 0.920406  0.738911  0.994401  0.9954
   2 │ 0.18791   0.845132  0.277577  0.231483
   3 │ 0.361269  0.918367  0.793115  0.988914
   4 │ 0.725052  0.962762  0.413111  0.328261

Upvotes: 9

Kyle Protho
Kyle Protho

Reputation: 31

A little late, but with the update to the DataFrame() function, I created a custom function that would take a matrix (e.g. an XLSX imported dataset) and convert it into a DataFrame using the first row as column headers. Saves me a ton of time and, hopefully, it helps you too.

function MatrixToDataFrame(mat)
    DF_mat = DataFrame(
        mat[2:end, 1:end],
        string.(mat[1, 1:end])
    )
    return DF_mat
end

Upvotes: 2

user17029991
user17029991

Reputation: 11

DataFrame([1 2 3 4; 5 6 7 8; 9 10 11 12], :auto)

This works as per >? DataFrame

Upvotes: 1

Josh Glaab
Josh Glaab

Reputation: 11

So I found this online and honestly felt dumb.

using CSV
WhatIWant = DataFrame(WhatIHave)

this was adapted from an R guide, but it works so heck

Upvotes: 1

JobJob
JobJob

Reputation: 4127

# convert a Matrix{Any} with a header row of col name strings to a DataFrame
# e.g. mat2df(["a" "b" "c"; 1 2 3; 4 5 6])

mat2df(mat) = convert(DataFrame,Dict(mat[1,:],
                     [mat[2:end,i] for i in 1:size(mat,2)]))

# convert a Matrix{Any} (mat) and a list of col name strings (headerstrings) 
# to a DataFrame, e.g. matnms2df([1 2 3;4 5 6], ["a","b","c"])

matnms2df(mat, headerstrs) = convert(DataFrame,
    Dict(zip(headerstrs,[mat[:,i] for i in 1:size(mat,2)])))

Upvotes: 2

lindsayhunter
lindsayhunter

Reputation: 41

I've been confounded by the same issue a number of times, and eventually realized the issue is often related to the format of the array, and is easily resolved by simply transposing the array prior to conversion.

In short, I recommend:

julia> convert(DataFrame, x')

Upvotes: 4

spencerlyon2
spencerlyon2

Reputation: 9676

This works for me:

julia> using DataFrames

julia> x = rand(4, 4)
4x4 Array{Float64,2}:
 0.790912  0.0367989  0.425089  0.670121
 0.243605  0.62487    0.582498  0.302063
 0.785159  0.0083891  0.881153  0.353925
 0.618127  0.827093   0.577815  0.488565

julia> convert(DataFrame, x)
4x4 DataFrame
| Row | x1       | x2        | x3       | x4       |
|-----|----------|-----------|----------|----------|
| 1   | 0.790912 | 0.0367989 | 0.425089 | 0.670121 |
| 2   | 0.243605 | 0.62487   | 0.582498 | 0.302063 |
| 3   | 0.785159 | 0.0083891 | 0.881153 | 0.353925 |
| 4   | 0.618127 | 0.827093  | 0.577815 | 0.488565 |

Are you trying something different?

If that doesn't work try posting a bit more code we can help you better.

Upvotes: 10

Related Questions