MENU

pandasのmergeで行数が増える原因と止め方

当ページのリンクには広告(PR)が含まれていることがあります。
pandasのmergeで行数が増える原因と止め方。明細とマスター、キー重複を検査、行の増加を止めるの処理例。

商品名を付けるために表を結合しただけで、売上の行数や合計が増えることがあります。よくある条件の一つは、商品マスターに同じ商品コードが複数あることです。左側の一明細が右側の複数行と一致すると、その分だけ結合結果が増えます。

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日に確認しました。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次