Pythonで大量のCSVファイルを結合する方法

プログラミング

Pythonで大量のCSVファイルを結合する

Pythonを使用して、大量のCSVファイルを効率的に結合する方法について解説します。ここでは、汎用性の高いpandasライブラリを用いた方法を中心に、いくつかのシナリオや考慮事項についても触れていきます。

1. pandasライブラリを用いた基本結合

pandasは、データ分析や操作に非常に強力なライブラリであり、CSVファイルの読み込み、操作、結合に最適です。大量のファイルを扱う場合でも、そのパフォーマンスと簡便さから第一候補となります。

1.1. 必要なライブラリのインポート

まず、pandasライブラリと、ファイルシステムを操作するためのosライブラリをインポートします。


import pandas as pd
import os

1.2. 結合対象のCSVファイルリストの取得

結合したいCSVファイルが保存されているディレクトリを指定し、そのディレクトリ内の全てのCSVファイル名を取得します。os.listdir()関数でディレクトリ内のファイル一覧を取得し、.endswith('.csv')でCSVファイルのみをフィルタリングします。


# CSVファイルが保存されているディレクトリパス
directory_path = '/path/to/your/csv/files'

# ディレクトリ内の全ファイル名を取得
all_files = os.listdir(directory_path)

# CSVファイルのみをフィルタリング
csv_files = [os.path.join(directory_path, file) for file in all_files if file.endswith('.csv')]

1.3. CSVファイルの読み込みと結合

取得したCSVファイルリストをループ処理し、各ファイルをpandas.read_csv()でDataFrameに読み込みます。そして、それらをリストに格納しておき、最後にpandas.concat()関数で一つのDataFrameに結合します。


# 全てのDataFrameを格納するリスト
all_dataframes = []

# 各CSVファイルを読み込み、リストに追加
for file in csv_files:
try:
df = pd.read_csv(file)
all_dataframes.append(df)
except Exception as e:
print(f"ファイル '{file}' の読み込み中にエラーが発生しました: {e}")

# 全てのDataFrameを結合
if all_dataframes:
combined_df = pd.concat(all_dataframes, ignore_index=True)
print("CSVファイルの結合が完了しました。")
else:
print("結合対象のCSVファイルが見つかりませんでした。")

ignore_index=Trueを指定することで、結合後のDataFrameのインデックスがリセットされ、連番になります。これにより、元のファイルのインデックスの重複などを防ぐことができます。

1.4. 結合結果の保存

結合されたDataFrameは、to_csv()メソッドを使用して新しいCSVファイルとして保存できます。


# 結合結果を新しいCSVファイルに保存
output_file = 'combined_data.csv'
combined_df.to_csv(output_file, index=False)
print(f"結合結果を '{output_file}' に保存しました。")

ここでもindex=Falseを指定することで、DataFrameのインデックスがCSVファイルに書き込まれるのを防ぎます。

2. 考慮事項と応用

大量のファイルを結合する際には、いくつかの点に注意が必要です。

2.1. メモリ使用量

全てのCSVファイルを一度にメモリに読み込むと、メモリ不足になる可能性があります。特に、ファイルサイズが大きい場合やファイル数が非常に多い場合は、以下の工夫が必要です。

  • チャンク読み込み: pd.read_csv()chunksize引数を使用することで、ファイルを分割して読み込むことができます。これにより、一度にメモリにロードされるデータ量を減らすことができます。
  • 逐次結合: 複数のDataFrameを一度に結合するのではなく、一つずつ結合していく方法も考えられます。

2.2. ファイルの構造の違い

結合するCSVファイル間で、列名や列の順序が異なる場合があります。

  • 列名の統一: pandas.concat()は、デフォルトでは列名が一致しない場合、一致しない列をNaNで埋めて結合します。もし、列名を統一したい場合は、結合前に各DataFrameの列名を揃える処理が必要になります。
  • 特定の列のみ結合: 全ての列ではなく、特定の列だけを結合したい場合は、各DataFrameから必要な列を選択してから結合します。

2.3. エラーハンドリング

ファイルが存在しない、ファイルが破損している、エンコーディングが異なるなどの理由で、CSVファイルの読み込みに失敗する可能性があります。try-exceptブロックを使用して、エラーが発生した場合でも処理を続行できるようにすることが重要です。

2.4. パフォーマンスの最適化

  • データ型指定: pd.read_csv()dtype引数で、各列のデータ型を明示的に指定することで、メモリ使用量を削減し、処理速度を向上させることができます。
  • 不要な列の削除: 読み込み時にusecols引数で必要な列のみを指定することで、不要なデータをメモリにロードするのを避けることができます。

3. まとめ

Pythonとpandasライブラリを使用することで、大量のCSVファイルを効率的に結合することができます。基本的な結合手順はosライブラリでファイルリストを取得し、pandas.concat()で結合するという流れになります。しかし、実際の運用では、メモリ使用量、ファイルの構造の違い、エラーハンドリング、パフォーマンスの最適化といった点を考慮して、より堅牢で効率的なコードを実装することが求められます。これらの考慮事項を理解し、適切な手法を選択することで、大量のデータ処理をスムーズに行うことが可能になります。