web-dev-qa-db-fra.com

julia crée un cadre de données vide et y ajoute des lignes

J'essaie le module Julia DataFrames. Cela m'intéresse donc je peux l'utiliser pour tracer des simulations simples dans Gadfly. Je veux pouvoir ajouter des lignes de manière itérative au cadre de données et je veux l'initialiser comme vide. 

Les tutoriels/la documentation sur la manière de procéder sont rares (la plupart de la documentation décrit comment analyser les données importées). 

Pour ajouter à une trame de données non vide, rien de plus simple: 

df = DataFrame(A = [1, 2], B = [4, 5])
Push!(df, [3 6])

Cela revient. 

3x2 DataFrame
| Row | A | B |
|-----|---|---|
| 1   | 1 | 4 |
| 2   | 2 | 5 |
| 3   | 3 | 6 |

Mais pour un init vide, je reçois des erreurs. 

df = DataFrame(A = [], B = [])
Push!(df, [3, 6])

Message d'erreur: 

ArgumentError("Error adding 3 to column :A. Possible type mis-match.")
while loading In[220], in expression starting on line 2

Quel est le meilleur moyen d’initialiser une Julia DataFrame vide de manière à pouvoir y ajouter de manière itérative des éléments ultérieurement dans une boucle for?

26
cantdutchthis

Un tableau de longueur zéro défini en utilisant seulement [] n'aura pas suffisamment d'informations de type.

Julia> typeof([])
Array{None,1}

Donc, pour éviter ce problème, il suffit d'indiquer le type.

Julia> typeof(Int64[])
Array{Int64,1}

Et vous pouvez appliquer cela à votre problème DataFrame

Julia> df = DataFrame(A = Int64[], B = Int64[])
0x2 DataFrame

Julia> Push!(df, [3  6])

Julia> df
1x2 DataFrame
| Row | A | B |
|-----|---|---|
| 1   | 3 | 6 |
27
waTeim
using Pkg, CSV, DataFrames

iris = CSV.read(joinpath(Pkg.dir("DataFrames"), "test/data/iris.csv"))

new_iris = similar(iris, nrow(iris))

head(new_iris, 2)
# 2×5 DataFrame
# │ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species │
# ├─────┼─────────────┼────────────┼─────────────┼────────────┼─────────┤
# │ 1   │ missing     │ missing    │ missing     │ missing    │ missing │
# │ 2   │ missing     │ missing    │ missing     │ missing    │ missing │

for (i, row) in enumerate(eachrow(iris))
    new_iris[i, :] = row[:]
end

head(new_iris, 2)

# 2×5 DataFrame
# │ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species │
# ├─────┼─────────────┼────────────┼─────────────┼────────────┼─────────┤
# │ 1   │ 5.1         │ 3.5        │ 1.4         │ 0.2        │ setosa  │
# │ 2   │ 4.9         │ 3.0        │ 1.4         │ 0.2        │ setosa  │
1
The Unfun Cat