JavaでもDataFrameを使いたいとおもって、探すと、TableSawとかDFLibとかdataframe-ecがありました。軽量ライブラリのDFLibを使ってみようと思います。
サクッと試したいので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の機能も十分に使えるので、どんどん使っていければと思いますー。