pandasで結合したら行が増えた|mergeの重複を確認

pandasで結合したら行が増えた|mergeの重複を確認

記事
IT・テクノロジー
カテゴリ:Python

mergeで行が増えたら、結合に使う列を確認します。単価がサイズ別なら、商品コードに加えてサイズも条件にします。

ここでは、注文を全行残して単価を付けます。読み込み済みの注文表をorders、商品表をproductsとします。列名や表の名前は、自分のコードに合わせてください。

1.1件を見分ける列をそろえる

商品表には、P01のSサイズ120円、Mサイズ150円があります。商品コードだけで結合すると両方に当たり、注文3行が5行に増えました。

02_before_real.png
「商品コードとサイズが同じなら、単価は1つ」という表なので、元の結合行を次に変えます。

result = orders.merge(products,
on=["商品コード", "サイズ"], how="left",
validate="many_to_one", indicator=True)
print(len(orders), len(result))
print(result)

04_after_real.png
実測では「3 3」と表示され、各注文に正しい単価が付きました。最後の_merge列がbothなら結合キーが一致、left_onlyなら対応する商品が見つかっていません。行数に加え、サイズと単価も確認します。

結果はresultに入り、元の2表は変わりません。

2.まだMergeErrorで止まるとき

validate="many_to_one"は、右側の商品表で、指定した列の組み合わせが1行ずつか確認する指定です。自動で重複を消す機能ではありません。

例えば、同じP01のSサイズが2行あると止まります。次で重なった行を表示します。

cols = ["商品コード", "サイズ"]
print(products[products.duplicated(cols, keep=False)])

03_detect_real.png
同じ商品でも支店や年月が違えば、必要な複数行かもしれません。何を1件とする表なのかを確認し、注文表にも同じ情報がある場合だけ、結合する列を足してください。

結合する列に空欄がある場合も、内容を確認します。

判断できないときは保存・集計を進めず、商品表の正しい単価や適用条件を確認します。先頭だけ残す削除で合わせると、違う単価を付けるおそれがあります。

検証:Python 3.12.14/pandas 2.2.3。
直らないところがあれば、お気軽にご相談ください。

プロフィールはこちら


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す