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