Julia早引きノート［24］CSVFiles(DataFrameとの連携)

###CSVFiles(DataFrameとの連携)(書き方例)

```ruby:note24
◆パッケージ読み込み
　using CSVFiles, DataFrames


◆DataFrameの読み込み

　# CSVファイルの読み込み、DataFrameに格納
　df = DataFrame(load("data.csv"))

　# gzipファイルを読み込み、DataFrameに格納
　df = DataFrame(load(File(format"CSV", "iris_data.csv.gz")))


◆読み込み時オプション設定

　・区切り記号(delim)
　・クォート文字(quotechar)　(デフォルトはダブルクォーテーション)
　・ヘッダー有無(header_exists)　(デフォルトはheader_exists=true)

　# オプション設定例
　df = DataFrame(load(File(format"CSV", "data2.csv"); delim=';', quotechar='"', header_exists=false))


◆DataFrameの書き込み

　# DataFrameをCSVファイルへ書き出し
　save("df_output.csv", df)

　# gzipで圧縮されたCSVファイルを書き出す
　save(File(format"CSV", "output2.csv.gz"), df)


◆書き込み時オプション設定

　・区切り記号(delim)
　・クォート文字(quotechar)　(デフォルトはダブルクォーテーション)
　・ヘッダー有無(header_exists)　(デフォルトはheader_exists=true)
　・欠損値の設定(nastring)　(デフォルトは"NA")

　# オプション設定例
　save(File(format"CSV", "output3.csv"), df; delim=',', quotechar='"', nastring="NA", header=true)


◆pipe記法による読み込み、書き込み

　# 読み込みの記載方法
　df = load("data2.csv") |> DataFrame

　# 書き込みの記載方法
　df |> save("output.csv")


◆Matrix型への変換

　# DataFrameをMatrixへ変換
　data_matrix = Matrix(df)


◆配列からのDataFrame作成

　# 配列(Vector型)をDataFrameに変換する
　# [1, 2, 3, 4, 5]
　# 方法(1)
　df = DataFrame()
　df.a = [1, 2, 3, 4, 5]
　# 方法(2)
　df = DataFrame(b = [1, 2, 3, 4, 5])

```

##解説

Juliaでは、CSVファイルを読み込み、DataFrameにデータをセットすることができます。
これを行う際には、CSVFilesパッケージをインストールします。
CSVファイルからの読み込みだけでなく、CSVファイルへの出力もできます。


####(1)CSVFiles.jl及びDataFrames.jlのインストール

以下の手順でCSVFiles及びDataFramesパッケージをインストールします。
パッケージ管理モードでインストールを行います。

Juliaの対話型実行環境で角括弧文字の ] を押下してパッケージモードにします。
` add "CSVFiles" `
と入力してCSVFilesパッケージをインストールします。
(ダブルクォーテーションは無くても良いです)

以下のようにインストールが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a682b0b9-e025-532c-0bf0-ef4722c4ebd2.png)

もしDataFramesパッケージをインストールしていない場合は、合わせてインストールを行います。
` add "DataFrames" `
と入力してDataFramesパッケージをインストールして下さい。


####(2)CSVFilesの使い方

CSVFilesで使用できる機能や使い方を説明します。

**①CSVファイルを読み取り、DataFrameに格納する**

CSVファイルの読み込みを行い、取得データをDataFrameに格納します。
以下のようにloadメソッドで実行します。

```ruby:note24
using CSVFiles, DataFrames

# CSVファイルの読み込み、DataFrameに格納
df = DataFrame(load("data.csv"))
```

実行結果です(ここではiris_data.csvを読み込みました)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/0b255eae-8fbf-d62a-1040-a875ee7de9c0.png)

**②gzipファイルを読み込み、DataFrameに格納する**

CSVファイルが.gzに圧縮されたファイルの場合、以下のメソッドで読み込みを実行できます。format属性でCSV形式であることを指定しています。

```ruby:note24
using CSVFiles, DataFrames

# gzipファイルを読み込み、DataFrameに格納
df = DataFrame(load(File(format"CSV", "iris_data.csv.gz")))
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/2086a3ff-4ae1-13c8-0aff-bc346e0e2e66.png)

**③読み込み時オプション設定**

様々なオプションを設定することができます。

:small_blue_diamond: **拡張子指定**
拡張子が.csvでないCSVファイルを読み込む場合は、その拡張子を含むファイル名を指定できます。
` load(File(format"CSV", "csv_file.txt")) `

:small_blue_diamond: **区切り記号(delim)**
区切り記号を指定する場合は、delimを使用して指定します。

```ruby:note24
df = DataFrame(load(File(format"CSV", "data2.csv"); delim=';'))
```

:small_blue_diamond: **クォート文字(quotechar)**
CSVデータのクォート文字を指定することができます。
クォート文字とは、各データの前後を括っている記号です。
デフォルトでは["]ダブルクォーテーションです。

```ruby:note24
df = DataFrame(load(File(format"CSV", "data2.csv"); quotechar='"'))
```

CSVデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4dcd118b-e31b-17a4-47ec-0bcfd74dd995.png)
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/56691170-6e39-9a44-7a88-5ea7d55990b8.png)

CSVデータがシングルクォーテーションの場合は、以下のように設定します。

```ruby:note24
df = DataFrame(load(File(format"CSV", "data3.csv"); quotechar='''))
```

CSVデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f46a5e18-85e6-eeeb-e2ec-e62ec95ee698.png)
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/8dc541c6-0bbf-127d-59c5-047c317680c4.png)

:small_blue_diamond: **ヘッダー有無(header_exists)**
CSVデータの先頭行がヘッダー行であるか、そうでないかを指定します。
ヘッダー行である場合は、**header_exists=true**です。デフォルトではこちらが採用されます。
ヘッダー行のない場合は、**header_exists=false**と指定します。

```ruby:note24
df = DataFrame(load(File(format"CSV", "data4.csv"); header_exists=false))
```

CSVデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f37ef399-17df-ad90-6023-63babb16d318.png)
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/fee6aef1-64c8-a1cf-ccca-2b32e7a58b19.png)

**④DataFrameをCSVファイルに書き出す(保存する)**

DataFrameをファイルに保存する場合は、以下のように実行します。

```ruby:note24
using CSVFiles, DataFrames

# DataFrameのデータ
df = DataFrame(num = [1, 2, 3], fruit = ["apple","orange","lemmon"], price = [100, 200, 150])

# DataFrameをCSVファイルへ書き出し
save("df_output.csv", df)
```

**⑤gzipで圧縮されたCSVファイルを書き出す**

DataFrameを書き出したCSVファイルをgzip形式で圧縮し生成するには、以下のように実行します。

```ruby:note24
using CSVFiles, DataFrames

df = DataFrame(num = [1, 2, 3], fruit = ["apple","orange","lemmon"], price = [100, 200, 150])

# gzipで圧縮されたCSVファイルを書き出す
save(File(format"CSV", "output2.csv.gz"), df)
```

**⑥書き込み時オプション設定**

読み込みと同様に、書き込み処理でも様々なオプションを設定することができます。
以下はオプションを同時に設定した際のコーティング例です。

```ruby:note24
save(File(format"CSV", "output3.csv"), df; delim=',', quotechar='"', nastring="NA", header=true)
```

:small_blue_diamond: **欠損値の設定(nastring)**

欠損値取り扱いについて、これをどのような文字列で保持するかを設定します。
デフォルトでは"NA"です。

上記以外の設定項目は、読み込みの説明項目をご参照下さい。

####(3)pipe記法による読み込み、書き込みの記載方法

pipe(パイプ)記法(記号：[**|>**])により、より簡潔な記述ができます。
読み込み、書き込みそれぞれで以下のように記述します。

**①読み込みの記載方法**

CSVファイルからデータを読み込み、DataFrameに変換します。

```ruby:note24
using CSVFiles, DataFrames

df = load("data2.csv") |> DataFrame
```

実行結果例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/c6f4891d-e5fc-7e94-c6a3-cafc98c6f195.png)

**②書き込みの記載方法**

DataFrameのデータをファイルに書き出すには、以下のように実行します。

```ruby:note24
using CSVFiles, DataFrames

df = DataFrame(num = [1, 2, 3], fruit = ["apple","orange","lemmon"], price = [100, 200, 150])

df |> save("output.csv")
```

実行結果例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/b162117d-03c7-4509-40da-6f1421edfab9.png)

####(4)Matrix型への変換

取得したDataFrame型のデータをMatrix型へ変換する場合は、Matrix関数を使用できます。

```ruby:note24
df = DataFrame(load(File(format"CSV", "test.csv"); delim=',', header_exists=false))

data_matrix = Matrix(df)
```

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/ca30a451-98f0-6a77-69f2-0f985e2a36b8.png)

####(5)配列からのDataFrame作成

配列(Vector型)の配列をDataFrameに変換する方法は以下のような例がありますが、その他にも方法がありますので、詳細は下記のJuliaのDataFrames.jlドキュメントをご参照頂ければと思います。

**方法(1)**

```ruby:note24
# DataFrameを宣言
df = DataFrame()
# dfの列名"a"に配列をセットする
df.a = [1, 2, 3, 4, 5]
```

**方法(2)**

```ruby:note24
# DataFrame宣言と列"b"のセットを同時に実行する
df = DaraFrame(b = [1, 2, 3, 4, 5])
```



以上、CSVFilesを使用したCSVファイルの取扱方法を解説しました。
JuliaのCSVFiles及びDataFrameパッケージの機能はこれ以外にもありますので、さらなる詳細は以下のマニュアルなどをご参照下さい。

　:paperclip: CSVFiles.jlのドキュメント(Github)
　https://github.com/queryverse/CSVFiles.jl

　:paperclip: DataFrames.jlのドキュメント
　https://dataframes.juliadata.org/stable/

##もくじ
[Julia早引きノート［01］変数・定数の使い方](https://qiita.com/ttabata/items/a1ada2c0cba03672e105)
[Julia早引きノート［02］算術式、演算子](https://qiita.com/ttabata/items/90900d0914fa317f652d)
[Julia早引きノート［03］複素数]
(https://qiita.com/ttabata/items/225c77a4d71fafc3e482)
[Julia早引きノート［04］正規表現](https://qiita.com/ttabata/items/8b6e4a2b7c2ca299de03)
....
<details><summary>もくじを開く</summary><div>
[Julia早引きノート［05］if文]
(https://qiita.com/ttabata/items/4f0bcff1e32f60402dfb)
[Julia早引きノート［06］ループ処理]
(https://qiita.com/ttabata/items/2a53825101b0b75fb589)
[Julia早引きノート［07］try, catch, finally]
(https://qiita.com/ttabata/items/1d6fe990526c99b65b5f)
[Julia早引きノート［08］変数の型(Int, Float, Bool, Char, String)]
(https://qiita.com/ttabata/items/2b84a826e39bfe432b62)
[Julia早引きノート［09］関数 (1)基本編]
(https://qiita.com/ttabata/items/d9b4f2728ec0dbcc6394)
[Julia早引きノート［10］関数 (2)応用編]
(https://qiita.com/ttabata/items/462e216c43d519f1969d)
[Julia早引きノート［11］Nothing型]
(https://qiita.com/ttabata/items/0e5a6b21968d8752cf0b)
[Julia早引きノート［12］複合型(Composite Type)型]
(https://qiita.com/ttabata/items/27469216a3c33101c825)
[Julia早引きノート［13］タプル]
(https://qiita.com/ttabata/items/ebe35dbfec4efbc1c29a)
[Julia早引きノート［14］リスト(Array型一次元配列)]
(https://qiita.com/ttabata/items/7528863ccbb282e8260d)
[Julia早引きノート［15］辞書(dictionary)]
(https://qiita.com/ttabata/items/77a4f1d02b51d067bfb7)
[Julia早引きノート［16］集合]
(https://qiita.com/ttabata/items/ca8137922a785122037e)
[Julia早引きノート［17］多次元配列 (1)初期化]
(https://qiita.com/ttabata/items/01fecbd14363460a27a6)
[Julia早引きノート［18］多次元配列 (2)様々な演算や関数]
(https://qiita.com/ttabata/items/f35896a5fa005fba7fbc)
[Julia早引きノート［19］多次元配列 (3)サブ配列]
(https://qiita.com/ttabata/items/045c00406fe45270b42e)
[Julia早引きノート［20］ファイル入出力]
(https://qiita.com/ttabata/items/5a99c3998060d161ace8)
[Julia早引きノート［21］JSON、XMLファイルの入出力]
(https://qiita.com/ttabata/items/65ebec11830271f9be71)
[Julia早引きノート［22］Python関数やPythonモジュールの呼び出し]
(https://qiita.com/ttabata/items/3afc8cef40d1e98a7b17)
[Julia早引きノート［23］JuliaでのMatplotlibによるグラフ描画]
(https://qiita.com/ttabata/items/96a0e172addfac690cca)
[Julia早引きノート［24］CSVFiles(DataFrameとの連携)]
(https://qiita.com/ttabata/items/51446731a703b5aca524)
[Julia早引きノート［25］線形代数演算(ベクトル・行列計算)]
(https://qiita.com/ttabata/items/5abe14d5c510e8ca0f54)
(※引き続きコンテンツを増やしていきます)
</div></details>


##関連情報

:paperclip: CSVFiles.jlのドキュメント(Github)
https://github.com/queryverse/CSVFiles.jl

:paperclip: Julia - 公式ページ
https://julialang.org/

:paperclip: Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html

:paperclip: 初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035

:paperclip: Julia - Mathematics
https://docs.julialang.org/en/v1/base/math/

##ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。