python
Pandasでは単一のcsvやtsvからデータセットをpd.DataFrameとして読み込むことができる。
In [1]: import pandas as pd
In [2]: df = pd.read_csv("test.csv")
In [3]: df
Out[3]:
aaa aaa.1 aaa.2
0 bbb bbb bbb
1 ccc ccc cc
しかしデータのファイルが大きすぎるときや、あるいは機械学習におけるtrain/test分割など、 複数のファイルにデータ分割されてしまっていることがある。 このようなときはどのように複数ファイルをまとめて単一のデータフレームとして読み込めるのだろうか?
残念ながらpandasの組み込み関数としてはそのような機能は用意されていない。 せっかくなのでせめてワンライナーで読み込めるようにした。
In [1]: !cp test.csv test1.csv # csvを増やしておく
In [2]: import pandas as pd
In [3]: import glob
In [4]: df = pd.concat([pd.read_csv(f) for f in glob.glob("./*.csv")])
In [5]: df
Out[5]:
aaa aaa.1 aaa.2
0 bbb bbb bbb
1 ccc ccc cc
0 bbb bbb bbb
1 ccc ccc cc
# indexを振りなおしたいときはingnore_index
In [6]: df = pd.concat([pd.read_csv(f) for f in glob.glob("./*.csv")], ignore_index=True)
In [7]: df
Out[7]:
aaa aaa.1 aaa.2
0 bbb bbb bbb
1 ccc ccc cc
2 bbb bbb bbb
3 ccc ccc cc
pd.concatはデータフレームや系列のリストを渡すと連結して返してくれる
(縦にも横にも連結できるが、デフォルトでは縦方向)。
これにファイル検索モジュールglobで見つけたcsvを渡し、リスト内包表記で dfのリスト化、concatするという流れである。
globでファイルを探す範囲は正規表現を使って適当に絞ることができる。 例えば学習データだけを
./train_*.csvだけ探して読み込むなどもこれでできる。またcsvでなくtsvのときは
read_csvの代わりにread_tableを使うなどする。
動作確認したバージョン
- Python 3.10.5
- Flask==1.5.3
おすすめ記事
Python 内包表記の使い方をマスターするNumPy np.clip: arrayの値の範囲を指定した最大値・最小値に合わせて丸める
FlaskでWebサーバを立てるサンプル~最小限のコードで
同人ゲーム・イラストなど