🐍

(学習ログ)Python003:2つのCSVをキーで結合して先頭行を確認する

に公開

1. はじめに

  • この記事の目的
    Pandasで「取引」テーブルと「取引明細」テーブルの2つのCSVを読み込み、transaction_idをキーに結合(JOIN)し、先頭のレコードを確認するまでの最小手順を理解します。

  • この記事の概要

    1. CSVの読み込み、2) 必要列の選択、3) mergeによる結合、4) 結果の確認、という実務で頻出の流れをわかりやすく解説します。

2. サンプルコード

コード全文

import pandas as pd
sample_transaction = pd.read_csv('001_サンプル/sample_transaction_data.csv')
sample_transaction_detail = pd.read_csv('001_サンプル/sample_transaction_detail.csv')
sample_join_data = pd.merge(
    sample_transaction_detail,
    sample_transaction[["transaction_id", "payment_date", "customer_id"]],
    on="transaction_id",
    how="left"
)
sample_join_data.head()

行ごと・ブロックごとの説明

  • import pandas as pd
    Pandasライブラリをpdという短い別名で読み込みます。

  • pd.read_csv('...sample_transaction_data.csv')
    取引テーブル(例:取引ID・決済日・顧客IDなど)を読み込みます。

  • pd.read_csv('...sample_transaction_detail.csv')
    取引明細テーブル(例:取引ID・商品ID・数量・金額など)を読み込みます。

  • sample_transaction[["transaction_id", "payment_date", "customer_id"]]
    結合に必要な列だけに絞ってメモリと可読性を確保します(ベストプラクティス)。

  • pd.merge(..., on="transaction_id", how="left")
    明細(左側)を基準に左結合。取引に情報があれば埋まり、なければNaNになります。

  • sample_join_data.head()
    結合結果の先頭5行を確認して、列構成や結合が想定通りか素早く点検します。

  • 実行結果例

   transaction_id  line_no  item_id  qty  amount  payment_date  customer_id
0            1001        1     A001    2    1200    2025-09-20         501
1            1001        2     B010    1     800    2025-09-20         501
2            1002        1     A001    1     600    2025-09-21         777
3            1003        1     C777    3    3600           NaN         NaN
4            1004        1     B010    2    1600    2025-09-22         888
  • 読み取り方の例

    • transaction_id=1001の明細が2行に分かれており、決済日や顧客IDが正しく複製されて結合されています。
    • transaction_id=1003は取引側に該当がなくNaN(欠損)→ 左結合の典型的な挙動を示しています。

3. エラーと確認のポイント

代表的なエラー文と対処

  1. ファイルが見つからない

    • エラー例:FileNotFoundError: [Errno 2] No such file or directory: '001_サンプル/sample_transaction_data.csv'
    • 対処:パスの綴り・相対/絶対パスを再確認。実行ディレクトリとファイルの配置を合わせる。
  2. 列名が存在しない

    • エラー例:KeyError: "['payment_date'] not in index"
    • 対処:print(df.columns)で実在する列名を確認。表記ゆれ(大文字小文字、全角半角)に注意。
  3. 結合キーの重複・想定外の多重マッチ

    • エラー例:MergeError: Key contains duplicate entries...validate使用時)
    • 対処:左=多行/右=一意を想定するならpd.merge(..., validate="m:1")で事前検証。重複があれば右側を集約(drop_duplicatesgroupby)してから結合。
  4. 型不一致によるミスマッチ

    • 症状:キーが見た目同じでも結合できない(片方が文字列、片方が整数など)。
    • 対処:astypeで型を揃える(例:df['transaction_id'] = df['transaction_id'].astype(str))。

よく使う確認メソッドや出力例

# 列名・件数
print(sample_transaction.shape, sample_transaction_detail.shape)
print(sample_transaction.columns.tolist())

# 結合前にキーのユニーク性を確認(右表:取引は1件=1行を想定)
print(sample_transaction['transaction_id'].duplicated().sum())  # 0が望ましい

# 結合検証(多対一を期待する場合)
sample_join_data_check = pd.merge(
    sample_transaction_detail,
    sample_transaction[["transaction_id", "payment_date", "customer_id"]],
    on="transaction_id",
    how="left",
    validate="m:1"  # m:1=「左多対右一」を期待
)

# 結合後の欠損チェック(右側キー未一致の検出)
print(sample_join_data[['payment_date', 'customer_id']].isna().sum())

# 代表的な目視確認
print(sample_join_data.head(10).to_string(index=False))

期待される出力例

(1200, 5) (2400, 6)
['transaction_id', 'payment_date', 'customer_id', 'branch_id', 'channel']
0
payment_date     12
customer_id      12
dtype: int64
 transaction_id  line_no item_id  qty  amount payment_date  customer_id
          1001       1    A001    2    1200   2025-09-20          501
          1001       2    B010    1     800   2025-09-20          501
          1002       1    A001    1     600   2025-09-21          777
          1003       1    C777    3    3600         NaN          NaN
          1004       1    B010    2    1600   2025-09-22          888
  • ポイント

    • validate="m:1" で想定外の多重マッチを早期検知。
    • isna().sum() で、未マッチによる欠損を定量的に把握。
    • to_string(index=False) で、目視しやすい表形式に整え、レビュー効率UP。

4. まとめ

  • CSVを読み込む→必要列に絞る→mergeで左結合→head()で確認という最小手順を理解した。
  • 結合の品質は、キーのユニーク性(duplicated)・validate="m:1"・欠損チェック(isna() で素早く検証できる。
  • 実務では、列名・型の整合パスの妥当性がエラーの大半。チェック用スニペットを手元に置くと再発防止に役立つ。

Discussion