pandasのmergeで行数が増える原因と重複キーを確認した話

業務でpandasを使い始めると、避けて通れないのがデータの結合操作です。複数の表を一つにまとめるmergeは非常に便利です。ExcelのVLOOKUP関数のような感覚で使えます。ところが、この直後にトラブルがよく起こるのです。なぜか元のデータより行数が増えてしまいます。結果として集計の合計金額が合わなくなります。重複したデータが延々と並ぶこともありました。これらを見ると自分のコードを疑うかもしれません。実は、これはpandasのバグではありません。データの持ち方とmergeの仕様によるものです。pandasのmergeはVLOOKUPとは異なります。

キーの重複時にすべての組み合わせを作る仕様です。この性質を知らないとデータの膨張を防げません。今回は、私の失敗談をベースに解説していきます。月次処理で1000行が3000行に膨れ上がりました。そのせいで残業になった経験を振り返ります。重複キーの確認と安全な結合手順もまとめます。

まず、原因を特定するための現状把握が第一歩です。なぜ行数が増えたのかコードで確認しましょう。どのキーが重複しているかも調べる必要があります。この習慣で集計ミスのリスクを大幅に減らせるはずです。たとえば、結合前後で必ず行数を表示させるようにしています。特定の引数で結合ルールを制限するのも効果的です。それでは具体的な失敗例と解決策を見てみましょう。

merge時の行数激増、データ重複の罠

以前、月次の売り上げ明細表に部署マスタを結合しました。部署ごとの集計レポートを作成しようとした時の話です。明細データは1,000行ほど存在していました。merge後もそのままの行数だと思い込んでいたのです。ところが、処理が終わったデータフレームを確認します。なんと行数が3,000行を超えていました。明細表と部署マスタをmergeした際の出来事です。元データより行数が増えて合計金額までずれました。最初はpandasのバグかと思ってとても焦りました。実際は自分のデータ構造の理解不足が原因でした。慌てて合計金額を電卓で再計算したことを今でも鮮明に覚えています。

本来の3倍近い数値になっており冷や汗が出ました。このまま報告書を出していたら大変なことになります。会社に大きな誤解を与えてしまうところでした。この行数増加は、早めに気づきたい落とし穴の一つでした。非エンジニアがpandasを使う上で注意が必要になります。

日本語インターフェースのJupyter Notebook上で、merge後のデー

一見すると単純な結合操作のように思えるでしょう。しかし、データの裏側に潜む重複が牙を剥きます。原因特定の際は結合キーの列を再確認してください。

行数3倍の原因:マスタ重複と結合

なぜ行数が3倍になったのか調べることにしました。結合に使った部署マスタの中身を詳しく調査します。すると、マスタ側で驚きの事実が見つかったのです。同じ部署コードが3行ずつ登録されていました。本来なら1つのコードに1つの部署名が対応するはずです。しかし、過去の履歴データがそのまま残っていました。

原因を追うとマスタ側の部署コードが重複しています。1行の明細に複数の部署名候補が結びついていました。履歴管理用の古いデータが削除されずにいたのです。最新の1行だけが必要な場面で全行を拾っていました。明細表の1行にマスタ側の3行がマッチしてしまいます。結果として1行が3行に増殖していたわけです。

結合キーとなる列に重複があるとどうなるでしょうか。pandasはすべての組み合わせを作成してしまいます。親切にも、あるいは容赦なく処理を実行するのです。

Excelで開いた部署マスタの画面。日本語のデータが並び、部署コード「A101」

左結合の冷徹な事実、重複で行数増

そこで一つの冷徹な事実を理解することになりました。左結合であっても右側の表に重複があれば行数は増えます。この仕組みを知らないと大きな誤解を生むでしょう。Excelのように最初に見つかったものだけを取得しません。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

mergeの重複爆発を防ぐキー確認

ExcelのVLOOKUP関数を思い浮かべてみてください。重複があっても一番上にあるデータを返す仕様です。しかし、pandasのmergeは少し考え方が異なります。リレーショナルデータベースの結合と同じ仕組みです。つまり多対多の結合を許可する仕様となっています。

左の表に10行、右の表に10行の重複キーがあったとします。結合後はなんと100行に膨れ上がってしまうのです。たとえば、明細データの「商品ID」が重複しているとします。さらに商品マスタ側の「商品ID」も重複していたら大変です。結果は全く手の付けられない状態になってしまいます。

mergeを使う前に、確認しておきたいステップがあります。結合キーが一意であるかどうかをチェックすることです。意図的に多対多の結合を行いたい場面もあるでしょう。しかし事務作業の多くはマスタから名称を引く作業です。つまり多対一の結合が想定されているはずです。今どのタイプの結合を行うのか意識してみてください。これがミスを防ぐ最大の防御策となるはずです。

ツールが変われば前提となるルールも変化します。このことを常に肝に銘じておかなければなりません。では、具体的に重複をチェックする手順を見ていきましょう。

結合前に`duplicated`で重複チェック

結合後の行数に驚く前に対策を講じましょう。まずはキーとなる列に重複がないか調べる癖をつけます。そこで役立つのがpandasのduplicatedメソッドです。これを使えば重複行を真偽値で即座に判定できます。

マスタデータがdf_masterという名前だと仮定してください。対象列の後にduplicated().any()を実行します。これだけで簡単に重複の有無がわかるのです。もし結果がTrueなら重複が含まれている証拠です。そのままmergeすると行数が増えるリスクが高まります。

具体的な重複行を確認したい場合も簡単です。keep=Falseという引数を指定して抽出を実行します。該当する行だけを画面に表示させることが可能です。結合の直前に一行のコードを挟むだけで済みます。データの中身を可視化する非常に便利な方法です。私もこのチェックを怠って集計ミスを引き起こしました。

日本語のコメントが入ったPythonコードの画面。df.duplicated()

結合キーが複数ある場合も対応策が用意されています。subset引数で特定の列の組み合わせをチェックしてみましょう。まずは現状を疑うことから始めるのがデータ分析の鉄則です。

重複データ処理の落とし穴と整合性確保

重複が見つかった場合の対処法も考えてみましょう。安易にdrop_duplicatesで削除するのは危険です。これで解決すると思いがちですが大きな罠があります。重複行の中に古いデータと新しいデータが混在します。適当に消すと間違った情報を残してしまうからです。適当に重複を消して、古い単価で利益を計算しました。この時の失敗を教訓にしています。

私自身、ただ消せばよいと考えた時期がありました。しかし残す行を決めないと別の集計ミスが発生します。keep=’first’で先頭を残した時の失敗談を紹介しましょう。実は一番下の行が最新の単価設定だったのです。

そこで重要になるのが事前の並べ替え操作です。あらかじめ日付などでデータをソートしておきましょう。その上でkeep=’last’などの引数を使って意図した行を残します。重複削除は単なるお掃除ではありません。データの整合性を保つための意思決定そのものです。

データミスを防ぐ現場ルールとクレンジング基準

同じ部署コードで複数の行がある場合を想像してください。どの行が今の業務にふさわしいのか確認が必要です。現場の運用ルールをしっかり把握しなければなりません。これを怠ると行数は合っていても中身が間違ってしまいます。さらに厄介なミスに繋がるので十分に注意しましょう。データのクレンジングには明確な基準が求められるのです。次に、同じ失敗を減らすために自分が入れた安全策を書いておきます。

pandas mergeのvalidateで安全な結合

pandasのmergeには強力な引数が用意されています。それがvalidateという名前の便利なオプションです。これを使えば結合の制約をコードに持たせられます。「この結合は多対一であるはずだ」と明示するわけです。

たとえば、validate=’many_to_one’と記述してみましょう。もし右側の表に重複があったらどうなるでしょうか。pandasがエラーを出して処理を自動で中断してくれます。プログラムを実行した瞬間に間違いを指摘する仕組みです。異常なデータが生成される前に気づくことができます。

公式ドキュメントでも推奨されている優れた方法です。しかし、意外と使っている人は少ない印象を受けます。私は自分のうっかりミスを防止するために導入しました。すべてのmerge処理にこの引数を入れるようにしたのです。マスタデータに不備があった際もすぐにスクリプトが止まります。集計結果が出る前に気づけるので安全性が格段に向上しました。

日本語のVS Code画面。merge関数の中で validate='many_

状況に応じてone_to_oneなども使い分ける必要があります。自分の想定をコードにしっかり明示しておきましょう。これは半年後の自分への最高のプレゼントになるはずです。

merge行数チェックの安心

今ではmerge処理の前後で必ず行数を比較しています。差分があれば警告を出すような仕組みを自作しました。結合前の左側の行数と結合後の行数を確認するだけです。一致しているか判定する単純なif文を追加してみました。

最後にvalidateの指定と行数チェックを両方入れています。失敗した時点で即座に処理が止まるように設定しました。この仕組みを作ってからは万が一データが増えても安心です。すぐに気付けるため躊躇なく実行ボタンを押せるようになりました。二重三重のチェックを自動化の中に組み込むのは効果的です。人間が目視で確認する負担を最小限に抑えることができます。

10万行を超えるような大規模なデータを扱うとしましょう。その際、もはや目視でのチェックは不可能に近い作業です。しかしPythonとpandasの機能を使えば、整合性の確認はかなり楽になります。そこで得られる安心感も、業務自動化を続けてよかったと感じる理由の一つです。かつての行数が3倍になった恐怖を思い出すこともあります。

データ処理の安心作法

それでも今では落ち着いてデータに向き合えるようになりました。

晴れた日のオフィスのデスク。ノートパソコンの画面には「チェック完了:行数に異常な

失敗から学んだ確認の作法をこれからも大切にしていきます。そうすれば事務職でも、少しずつ安心してデータ処理に向き合えるようになります。同じようにmergeで行数が増えて困っている人がいたら、まずは行数チェックから試してみてください。

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

関連リンクとチェックリスト

関連書籍

Python業務自動化関連書籍を、手元で見返せる形にしておきたい場合

Pythonやデータ処理の自動化は、作りながら同じ基礎を何度も確認する場面が多いです。手元で見返せる本があると、調べ直しの時間を減らしやすいです。

Python業務自動化関連書籍をAmazonで探す

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

[アンケート] この記事は役に立ちましたか?


1問だけ回答する