Julia DataFrames.jl

DataFrames.jl は Julia でデータフレームを扱うためのパッケージである。データフレームとは2次元のデータである。行列 (Base.Matrix) とは異なり、複数のデータ型を格納できる。リレーショナル・データベースのテーブルがデータフレームに相当する。

目次

  1. 1 インストール
  2. 2 パッケージの宣言
    1. 2.1 import
    2. 2.2 using
  3. 3 データフレームの作成
  4. 4 Base.size
  5. 5 内部結合
  6. 6 外部結合

1 インストール

Julia から Dataframes.jl パッケージを使うには、Julia に Dataframes.jl パッケージをインストール(追加)する必要がある。Dataframes.jl パッケージをインストールせずに Dataframes.jl パッケージを使用しようとすると、エラーが発生する。

julia> using DataFrames
│ Package DataFrames not found, but a package named DataFrames is available from a registry.
│ Install package?
│   (@v1.9) pkg> add DataFrames
└ (y/n/o) [y]:

ここで「y」のキーを押せば、Dataframes.jl パッケージが追加される。

パッケージの追加は、Julia のインストール後に一度だけ行えばよい。パッケージを使う度に追加する必要はない。

2 パッケージの宣言

Dataframes.jl パッケージを使うには、using または import で Dataframes.jl パッケージの使用を宣言する必要がある。Dataframes.jl パッケージの使用を宣言せずに Dataframes.jl パッケージを使用すると、エラーが発生する。

julia> df = DataFrames.DataFrame(No = 1:3, Name = ["井上和", "小川彩", "菅原咲月"])
ERROR: UndefVarError: `DataFrames` not defined

2.1 import

import キーワードを使ってパッケージの使用を宣言すると、そのパッケージに含まれる定数、型、関数及びメソッド等を使用できる。定数、型、関数及びメソッド等を使用するときは、パッケージ名で修飾する必要がある。

julia> import DataFrames

julia> df = DataFrame(No = 1:3, Name = ["井上和", "小川彩", "菅原咲月"])
ERROR: UndefVarError: `DataFrame` not defined

julia> df = DataFrames.DataFrame(No = 1:3, Name = ["井上和", "小川彩", "菅原咲月"])
3×2 DataFrame
 Row │ No     Name
     │ Int64  String
─────┼─────────────────
   1 │     1  井上和
   2 │     2  小川彩
   3 │     3  菅原咲月

2.2 using

using キーワードを使ってパッケージの使用を宣言すると、そのパッケージに含まれる定数、型、関数及びメソッド等はエクスポートされるため、パッケージ名で修飾せずに定数、型、関数及びメソッド等を使用できる。

julia> using DataFrames

julia> df = DataFrame(No = 1:3, Name = ["井上和", "小川彩", "菅原咲月"])
3×2 DataFrame
 Row │ No     Name
     │ Int64  String
─────┼─────────────────
   1 │     1  井上和
   2 │     2  小川彩
   3 │     3  菅原咲月

3 データフレームの作成

DataFrame型のオブジェクトは、データテーブルを一連のベクトルとして表し、それぞれが列または変数に対応する。DataFrameを構築する最も簡単な方法は、キーワード引数またはペアを使用してカラムベクトルを渡すことである。

julia> using DataFrames

julia> df = DataFrame(No = 1:3, Name = ["Sana", "Kokona", "Neo"])
3×2 DataFrame
│ Row │ No    │ Name   │
│     │ Int64 │ String │
├─────┼───────┼────────┤
│ 1   │ 1     │ Sana   │
│ 2   │ 2     │ Kokona │
│ 3   │ 3     │ Neo    │

カラムはデータフレーム経由で直接アクセスできる。

julia> df.Name
3-element Array{String,1}:
"Sana"
"Kokona"
"Neo"

julia> df."Name"
3-element Array{String,1}:
"Sana"
"Kokona"
"Neo"

リテラル名ではなく、カラムの名前を保持する変数を渡すこともできる。

julia> col = "Name"
"Name"

julia> df[!, col]
3-element Array{String,1}:
"Sana"
"Kokona"
"Neo"

julia> df[:, col]
3-element Array{String,1}:
"Sana"
"Kokona"
"Neo"

julia>

カラム名は、names関数を使用して文字列として取得できる。

julia> names(df)
2-element Array{String,1}:
"No"
"Name"

空のデータフレームから開始して、1つずつ列を追加することもできる。

julia> df = DataFrame()
0×0 DataFrame


julia> df.No = 1:3
1:3

julia> df.Name = ["Sana", "Kokona", "Neo"]
3-element Array{String,1}:
"Sana"
"Kokona"
"Neo"

julia> df
3×2 DataFrame
│ Row │ No    │ Name   │
│     │ Int64 │ String │
├─────┼───────┼────────┤
│ 1   │ 1     │ Sana   │
│ 2   │ 2     │ Kokona │
│ 3   │ 3     │ Neo    │

4 Base.size

Base.size 関数を使用して、データフレームの行及び列の要素数を確認できる。第二引数に次元を指定して、行のみ又は列のみの要素数を確認することもできる。

julia> size(df)
(3, 2)

julia> size(df, 1)
3

julia> size(df, 2)
2

5 内部結合

内部結合とは、結合条件を満たす行のみを結合することである。

Julia言語でデータフレームを内部結合するには、innerjoin() を使う。

julia> emp = DataFrame(Ename = ["白鳥沙南", "佐藤愛桜", "野崎結愛"], Deptno = [1, 2, 3])
3×2 DataFrame
 Row │ Ename     Deptno
     │ String    Int64
─────┼──────────────────
   1 │ 白鳥沙南       1
   2 │ 佐藤愛桜       2
   3 │ 野崎結愛       3

julia> dept = DataFrame(Deptno = [1, 3], Dname = ["中等部3年", "中等部2年"])
2×2 DataFrame
 Row │ Deptno  Dname
     │ Int64   String
─────┼───────────────────
   1 │      1  中等部3年
   2 │      3  中等部2年

julia> innerjoin(emp, dept, on = :Deptno)
2×3 DataFrame
 Row │ Ename     Deptno  Dname
     │ String    Int64   String
─────┼─────────────────────────────
   1 │ 白鳥沙南       1  中等部3年
   2 │ 野崎結愛       3  中等部2年

6 外部結合

外部結合とは、結合条件を満たす行に加えて、結合条件を満たさない行も結合することである。

Julia言語でデータフレームを外部結合するには、outerjoin() を使う。

julia> emp = DataFrame(Ename = ["白鳥沙南", "佐藤愛桜", "野崎結愛"], Deptno = [1, 2, 3])
3×2 DataFrame
 Row │ Ename     Deptno
     │ String    Int64
─────┼──────────────────
   1 │ 白鳥沙南       1
   2 │ 佐藤愛桜       2
   3 │ 野崎結愛       3

julia> dept = DataFrame(Deptno = [1, 3], Dname = ["中等部3年", "中等部2年"])
2×2 DataFrame
 Row │ Deptno  Dname
     │ Int64   String
─────┼───────────────────
   1 │      1  中等部3年
   2 │      3  中等部2年

julia> outerjoin(emp, dept, on = :Deptno)
3×3 DataFrame
 Row │ Ename     Deptno  Dname
     │ String    Int64   String
─────┼─────────────────────────────
   1 │ 白鳥沙南       1  中等部3年
   2 │ 野崎結愛       3  中等部2年
   3 │ 佐藤愛桜       2  missing