HOWTO · Python

複数の CSV ファイルを Pandas にインポートし、1つの DataFrame に連結する

このチュートリアルでは、Pandas を使用して複数の CSV ファイルをインポートし、それらを単一の DataFrame に連結する方法を示します。

このページの内容

一致した各CSVファイルをpandas.read_csv()で読み込み、得られたDataFrameをpd.concat()で結合します。1つのフォルダー内でファイルを探し、順序を一定にして読み込んだ後、新しい行インデックスを持つ1つのDataFrameを作成する手順です。Python環境にpandasがインストールされていない場合は、先にインストールしてください。

pandasでCSVファイルを1つ読み込む

pandasには、CSVファイルをDataFrameに読み込むread_csv()があります。1つのファイルを読むには、df = pd.read_csv("sales.csv")を実行し、ファイル名をデータのパスに置き換えます。既定では先頭行が列名として読み込まれるため、読み込み後のDataFrameの列ラベルを確認し、意図したとおりに解析されたか確かめてください。複数ファイルを扱う場合も、各パスに対して同じ処理を使います。

globでCSVファイルを探し、パスを組み立てる

Python標準ライブラリのglobモジュールを使うと、パターンに一致するパスを探せます。別途パッケージをインストールする必要はありません。glob.glob()は、一致したパスをリストとして返します。フォルダーとファイル名のパターンをos.path.join()で結合すると、実行環境に適した区切り文字を使ってパスを組み立てられます。

pattern = os.path.join(folder, "*.csv")

*.csvパターンは、指定したフォルダーの直下にあるCSVファイルを対象にします。サブフォルダーも対象にするには、再帰的なglobパターンを使い、glob.glob()の呼び出しでrecursive=Trueを指定します。Windowsでは、r"C:\data\sales"のようなraw文字列を使うと、バックスラッシュがエスケープシーケンスとして解釈されません。os.path.join()を使えば、このフォルダーパスにファイル名のパターンを追加できます。

複数のCSVファイルを読み込み、DataFrameを連結する

一致したパスを集め、それぞれのパスに対してread_csv()を呼び出し、得られたDataFrameをpd.concat(..., ignore_index=True)に渡します。次の完全な例では、一時フォルダーに小さなCSVファイルを2つ作成するため、追加ファイルを用意せずにそのまま実行できます。自分のデータを使う場合は、サンプルファイルの作成部分をfolderのパスに置き換え、パスの検索、読み込み、連結の手順はそのまま使ってください。パターンに一致するファイルがない場合、例ではメッセージを表示し、読み込みと連結を行いません。ファイルが見つかった場合は、最後の出力で結合後の行を確認できます。

import glob
import os
import tempfile
from pathlib import Path

import pandas as pd

with tempfile.TemporaryDirectory() as temp_dir:
    folder = Path(temp_dir)
    (folder / "jan.csv").write_text("month,sales\nJan,10\n", encoding="utf-8")
    (folder / "feb.csv").write_text("month,sales\nFeb,12\n", encoding="utf-8")

    pattern = os.path.join(str(folder), "*.csv")
    csv_paths = sorted(glob.glob(pattern))
    if not csv_paths:
        print("No CSV files found.")
    else:
        dataframes = [pd.read_csv(csv_path) for csv_path in csv_paths]
        combined = pd.concat(dataframes, ignore_index=True)
        print(combined.to_string(index=False))
month  sales
  Feb     12
  Jan     10

パスをソートするとファイルの順序が一定になり、行はその順序で並び、各ファイル内の元の順序も保たれます。ignore_index=Trueを指定すると、結合したすべての行に新しい連番インデックスが割り当てられます。ファイルごとに列名が異なる場合、pandasは列ラベルに基づいて値を対応させ、欠けている値をNaNで補います。各行で同じ項目を表す必要がある場合は、列名を統一してください。pd.concat()には少なくとも1つのDataFrameが必要なので、連結する前に一致したファイルがあることを確認します。ファイルが見つからない場合は、読み込みと結合の処理を実行する前に、フォルダーまたはパターンを調整してください。