ソフトウェアエンジニアの雑記

日々思ったことをまとめます

JavaでDataFrame操作をDFLibで試す

JavaでもDataFrameを使いたいとおもって、探すと、TableSawとかDFLibとかdataframe-ecがありました。軽量ライブラリのDFLibを使ってみようと思います。

dflib.org

サクッと試したいのでjbangで試すこととします。jbangの記事はこちら

サンプルソースはこちらになります。

DFLib Sample ( DataFrame implements Java) · GitHub

DataFrameに読み込ませて、ソートする

対象のデータファイルは下記のようになっています。

data.tsv

a   b   c   d
--  --  --  --
4   5   6   a
40  41  42  a
46  47  48  a
52  53  54  b
58  59  60  b
64  65  66  c
94  95  96  c

Javaコードは下記のようになります。DFLibはデータロード時にデフォルトでは文字列として扱います。数値として扱う場合は、intCol()で設定する必要があります。例の場合は、カラムcを数値として扱うようにします。こうするとソートが機能します。

///usr/bin/env jbang "$0" "$@" ; exit $?

//DEPS org.dflib:dflib:1.3.0
//DEPS org.dflib:dflib-csv:1.3.0
//JAVA 25+

import org.apache.commons.csv.CSVFormat;
import org.dflib.DataFrame;
import org.dflib.Printers;
import org.dflib.csv.Csv;

void main(String... args) {
    CSVFormat csvFormat = CSVFormat.Builder.create().setDelimiter("\t").build();
    DataFrame dataFrame = Csv.loader().format(csvFormat).header("a","b","c","d").intCol("c").offset(2).load("data.tsv").sort("c",false);
    IO.println(Printers.tabular(100,100).toString(dataFrame));
}

====出力結果

a  b   c d
-- -- -- -
94 95 96 c
64 65 66 c
58 59 60 b
52 53 54 b
46 47 48 a
40 41 42 a
4  5   6 a

上記のようにソートができます。

2つのファイルはDataFrameに読み込ませて、結合する

上記のdata.tsvとtype.tsvをDFLibで結合する。ファイルは下記。

// type.tsv

type    name
--  --
a   TypeA
b   TypeB
c   TypeC

DataFrameを別々に読み込みませて、カラムaとカラムtypeを指定して結合してみます。

void main(String... args) {
    CSVFormat csvFormat = CSVFormat.Builder.create().setDelimiter("\t").build();
    DataFrame dataFrame = Csv.loader().format(csvFormat).header("a","b","c","d").intCol("c").offset(2).load("data.tsv").sort("c",false);
    DataFrame dataFrameType = Csv.loader().format(csvFormat).header("type", "name").offset(2).load("type.tsv");

    DataFrame selectFrame = dataFrame.innerJoin(dataFrameType).on("d", "type").select();
    IO.println(Printers.tabular(100,100).toString(selectFrame.cols("a","b","c","name").select()));
}

a  b   c name 
-- -- -- -----
94 95 96 TypeC
64 65 66 TypeC
58 59 60 TypeB
52 53 54 TypeB
46 47 48 TypeA
40 41 42 TypeA
4  5   6 TypeA

上記のように結合できました。出力時にカラムも絞ることができます。

まとめ

Javaでも簡単にDataFrameが使えるようになります。グラフ描画もできますし、そこそこ使えるかなと思います。

ポエム

Java25になって、mainメソッドとかなくても簡単に書けるようになっているのは、便利です。void main() でコードが書けるので、サンプルコードもシンプルになりますし、jbangの機能も十分に使えるので、どんどん使っていければと思いますー。