web-dev-qa-db-ja.com

juliaは空のデータフレームを作成し、それに行を追加します

Julia DataFramesモジュールを試しています。 Gadflyで簡単なシミュレーションをプロットするために使用できるように、それに興味があります。データフレームに繰り返し行を追加できるようにしたいし、それを空として初期化したい。

これを行う方法に関するチュートリアル/ドキュメントはまばらです(ほとんどのドキュメントはインポートされたデータの分析方法を説明しています)。

空でないデータフレームに追加するのは簡単です:

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

これは戻ります。

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

しかし、空のinitの場合、エラーが発生します。

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

エラーメッセージ:

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

後でforループで項目を繰り返し追加できるように、空のJulia DataFrameを初期化する最良の方法は何ですか?

30
cantdutchthis

[]のみを使用して定義された長さ0の配列には、十分な型情報がありません。

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

したがって、その問題を回避するには、単にタイプを示すだけです。

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

そして、あなたはそれをあなたの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 |
28
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