Post

Pythonで作るCSVマージツール - 2つのCSVファイルを簡単に結合


この記事はZennでも公開しています。

Pythonで作るCSVマージツール - 2つのCSVファイルを簡単に結合

はじめに

データ分析やデータ処理の現場では、複数のCSVファイルを結合する必要がよくあります。特に、異なるソースから取得したデータを統合する際に、このような操作が必要になります。

この記事では、Pythonを使用して2つのCSVファイルを指定したキーでマージするCLIツールを作成する方法を紹介します。

作成するツールの機能

  • 2つのCSVファイルを引数として受け取る
  • マージのキーを指定可能
  • 出力ファイル名を指定可能(デフォルトはoutput.csv)
  • 重複する列は自動的に1つにまとめる
  • エラーハンドリング機能付き

開発環境のセットアップ

1. プロジェクトの作成

1
2
mkdir py_merge_csv
cd py_merge_csv

2. 仮想環境の作成と有効化

1
2
3
4
python -m venv .venv
source .venv/bin/activate  # Linux/macOS
# または
.venv\Scripts\activate  # Windows

3. 必要なパッケージのインストール

1
pip install pandas

コードの実装

1. メインスクリプトの作成

merge_csv.pyを作成し、以下のコードを実装します:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python3
import argparse
import pandas as pd
import sys

def merge_csv_files(file1, file2, key, output_file='output.csv'):
    try:
        # CSVファイルを読み込む
        df1 = pd.read_csv(file1)
        df2 = pd.read_csv(file2)

        # キーが両方のデータフレームに存在するか確認
        if key not in df1.columns or key not in df2.columns:
            print(f"エラー: 指定されたキー '{key}' が両方のCSVファイルに存在しません。")
            sys.exit(1)

        # データフレームをマージ
        merged_df = pd.merge(df1, df2, on=key, how='outer')

        # 結果をCSVファイルに出力
        merged_df.to_csv(output_file, index=False,  encoding="utf-8-sig")
        print(f"マージが完了しました。出力ファイル: {output_file}")

    except FileNotFoundError as e:
        print(f"エラー: ファイルが見つかりません - {e}")
        sys.exit(1)
    except pd.errors.EmptyDataError:
        print("エラー: 空のCSVファイルが指定されています。")
        sys.exit(1)
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        sys.exit(1)

def main():
    parser = argparse.ArgumentParser(description='2つのCSVファイルをマージします。')
    parser.add_argument('file1', help='1つ目のCSVファイルのパス')
    parser.add_argument('file2', help='2つ目のCSVファイルのパス')
    parser.add_argument('key', help='マージに使用するキー(列名)')
    parser.add_argument('-o', '--output', default='output.csv',
                      help='出力ファイル名(デフォルト: output.csv)')

    args = parser.parse_args()
    merge_csv_files(args.file1, args.file2, args.key, args.output)

if __name__ == '__main__':
    main()

2. テスト用データの準備

テスト用のCSVファイルを作成します。

test_data/customers.csv:

customer_id,name,email,phone
1,山田太郎,[email protected],090-1234-5678
2,鈴木花子,[email protected],090-2345-6789
3,佐藤次郎,[email protected],090-3456-7890

test_data/orders.csv:

customer_id,order_id,product,amount,order_date
1,ORD001,ノートパソコン,150000,2024-03-01
2,ORD003,キーボード,8000,2024-03-01
3,ORD004,モニター,30000,2024-03-03

使用方法

基本的な使い方

1
python merge_csv.py test_data/customers.csv test_data/orders.csv customer_id -o merged_result.csv

実行結果

マージされたmerged_result.csvには以下のような結果が出力されます:

customer_id,name,email,phone,order_id,product,amount,order_date
1,山田太郎,[email protected],090-1234-5678,ORD001,ノートパソコン,150000,2024-03-01
2,鈴木花子,[email protected],090-2345-6789,ORD003,キーボード,8000,2024-03-01
3,佐藤次郎,[email protected],090-3456-7890,ORD004,モニター,30000,2024-03-03

コードの解説

1. エラーハンドリング

このツールでは、以下のようなエラーケースに対応しています:

  • ファイルが見つからない場合
  • 空のCSVファイルが指定された場合
  • 指定されたキーが存在しない場合
  • その他の予期せぬエラー

2. pandasのmerge関数

pd.merge()関数を使用して、2つのデータフレームを結合しています。主なパラメータは:

  • on: 結合のキーとなる列名
  • how: 結合方法(’outer’は外部結合で、両方のデータフレームのすべての行を保持)

発展的な機能の追加

このツールは以下のような機能を追加することで、さらに便利にすることができます:

  1. 複数のキーでの結合
  2. 結合方法の選択(内部結合、外部結合、左結合、右結合)
  3. 特定の列のみを選択して出力
  4. 大きなファイルのチャンク処理
  5. 進捗表示機能

まとめ

この記事では、Pythonとpandasを使用してCSVファイルをマージするCLIツールを作成しました。このツールは:

  • シンプルな使い方
  • 堅牢なエラーハンドリング
  • 柔軟な出力オプション

を備えており、データ処理の現場で役立つツールとなっています。

参考リンク

This post is licensed under CC BY 4.0 by the author.