JP / EN

広告
2023/02/25

Pandas 複数のファイルをまとめてDataFrameとして読み込む

タグ: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サーバを立てるサンプル~最小限のコードで



このエントリーをはてなブックマークに追加

https://wonderhorn.net/