商品名を付けるために表を結合しただけで、売上の行数や合計が増えることがあります。よくある条件の一つは、商品マスターに同じ商品コードが複数あることです。左側の一明細が右側の複数行と一致すると、その分だけ結合結果が増えます。
pandasのmergeには、想定する結合の関係を検査するvalidateがあります。売上明細が複数、商品マスターは商品ごとに一行という前提なら、many_to_oneで右側の一意性を確認します。
重複したマスターで件数を比べる
次はAの商品が二度登場するマスターと、三件の売上明細です。すべて架空データです。検査なしの場合を見た後、validateを付けた結合が止まることを確認します。
import pandas as pd
sales = pd.DataFrame({
"コード": ["A", "B", "A"], "金額": [100, 200, 50]
})
bad_master = pd.DataFrame({
"コード": ["A", "A", "B"], "商品名": ["旧A", "新A", "B商品"]
})
unchecked = sales.merge(bad_master, on="コード", how="left")
print("結合前:", len(sales))
print("検査なしの結合後:", len(unchecked))
try:
sales.merge(bad_master, on="コード", how="left", validate="many_to_one")
except pd.errors.MergeError:
print("マスターの重複を検出")
else:
raise AssertionError("重複を検出できませんでした")
master = pd.DataFrame({
"コード": ["A", "B"], "商品名": ["A商品", "B商品"]
})
checked = sales.merge(master, on="コード", how="left", validate="many_to_one")
print("検査した結合後:", len(checked), "合計:", checked["金額"].sum())
assert len(unchecked) == 5
assert len(checked) == 3 and checked["金額"].sum() == 350
検査なしでは三件が五件へ増えます。重複のない別のマスターを使い、関係を検査した場合は三件、合計350です。Windows・Python 3.12.10・pandas 3.0.2で、この件数と検出を確認しました。
このコードは旧Aと新Aのどちらを正しい商品名と決める処理ではありません。重複に気づいた後、適用日や取引条件などを確認してマスターを用意し直す段階は分けています。
一対一と多対一を選ぶ
one_to_oneは両方の表のキーが一意であることを検査します。一請求一入金のような前提なら候補になりますが、分割入金がある業務へそのまま適用できません。
many_to_oneは右側だけの一意性を求めます。同じ商品が何度も売れる左側の明細は、重複があって構いません。一意にする側を取り違えると、正常な入力を止めることになります。
many_to_manyは重複を調べるための検査ではありません。エラーを消すために指定を緩める前に、一行が何を表すかを確認してください。
件数が同じでも確認は続く
結合後の行数が同じでも、商品が見つからず商品名が欠損することはあります。左結合で件数を保てたことと、全件が正しく照合できたことを分けて確認します。
また、pandasでは両側の欠損キー同士が一致する動作があります。キーが必須の表なら、結合前に空欄や欠損を検査し、確認対象を分けてください。似たコードの空白や表記を一律に直すかも別のルールです。
まず元の件数と合計を残し、結合後に同じ値を検算します。増えた場合に重複を探し、減った場合に結合方法や未一致の扱いを調べる順にすると、どの条件で変わったかを追えます。
表の基本はpandas入門、キーを決める考え方は取得データの重複判定で確認できます。
参考資料
pandas.merge公式資料を2026年11月1日に確認しました。
