📦

JuliaのDataFrameはPythonより厳格だった

2022/02/01に公開

同じDataFrameでも、JuliaはPythonよりも厳格で「インターフェースをキチンと決めてからデータを入れたりしてね」との作りになっていたため、ハマらない様にメモします。

df.py
# Pythonサンプルコード

import pandas as pd

# 空のDataFrame
df1 = pd.DataFrame()

# 2 x 2のDataFrame
df2 = pd.DataFrame([["AAA","BBB"],["123", "456"], columns=["A", "B"])

# サイズが異なるDataFrameを結合
df3 = pd.concat([df1, df2])
# -> 正常終了
# -> df2と同一のDataFrameが誕生
df.jl
# Juliaサンプルコード1

using DataFrames

# 空のDataFrame
df1 = DataFrame()

# 2 x 2のDataFrame
df2 = DataFrame(A=["AAA","BBB"], B=["123", "456"])

# サイズが異なるDataFrameを結合
df3 = vcat(df1, df2)
# -> 異常終了
# -> ArgumentError: column(s) A and B are missing from argument(s) 1

ちなみにJuliaは配列をパラメータにDataFrameにappendが出来るpush!メソッドもありますが、ここもカラム数と配列長が異なるとエラーで落ちます。

push.jl
# Juliaサンプルコード2

using DataFrames

# 空のDataFrame
df1 = DataFrame()

# 2 x 2のDataFrame
df2 = DataFrame(A=["AAA","BBB"], B=["123", "456"])

# 追加する行レコード
newrecord = ["CCC", "789"]

# DataFrameへのappend
push!(df1, newrecord)
# -> 異常終了
# -> ArgumentError: Length of iterable does not match DataFrame column count.

push!(df2, newrecord)
# -> 正常終了
# -> 行追加が出来ている

どんなデータが来るかを事前に定めておいてねー、との仕様に仕上がっています。何となく、GolangでCSV取り込みの処理を書いた時にstructureに事前に来るデータカラムを定義したことを思い出しました。
実際がどうか不明(調査をしていない)ですが、「どんなデータがを受け取るのか分からない」なんてことは止めよう、とのスタンスなのだと一旦は咀嚼しました。

という具合でPythonとは異なるため、Juliaでリライトする場合は注意しようと思った次第でしたー。

Discussion