🐍
(学習ログ)Python003:2つのCSVをキーで結合して先頭行を確認する
1. はじめに
-
この記事の目的
Pandasで「取引」テーブルと「取引明細」テーブルの2つのCSVを読み込み、transaction_idをキーに結合(JOIN)し、先頭のレコードを確認するまでの最小手順を理解します。 -
この記事の概要
- CSVの読み込み、2) 必要列の選択、3)
mergeによる結合、4) 結果の確認、という実務で頻出の流れをわかりやすく解説します。
- CSVの読み込み、2) 必要列の選択、3)
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. エラーと確認のポイント
代表的なエラー文と対処
-
ファイルが見つからない
- エラー例:
FileNotFoundError: [Errno 2] No such file or directory: '001_サンプル/sample_transaction_data.csv' - 対処:パスの綴り・相対/絶対パスを再確認。実行ディレクトリとファイルの配置を合わせる。
- エラー例:
-
列名が存在しない
- エラー例:
KeyError: "['payment_date'] not in index" - 対処:
print(df.columns)で実在する列名を確認。表記ゆれ(大文字小文字、全角半角)に注意。
- エラー例:
-
結合キーの重複・想定外の多重マッチ
- エラー例:
MergeError: Key contains duplicate entries...(validate使用時) - 対処:左=多行/右=一意を想定するなら
pd.merge(..., validate="m:1")で事前検証。重複があれば右側を集約(drop_duplicatesやgroupby)してから結合。
- エラー例:
-
型不一致によるミスマッチ
- 症状:キーが見た目同じでも結合できない(片方が文字列、片方が整数など)。
- 対処:
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