pandasのdrop_duplicatesで重複が削除されない原因と、自分が試した対処法の話

毎月の売上データを整理する作業は、本当に骨が折れます。複数のシステムから出力したCSVを統合する作業を想像してください。どうしてもデータの重複が発生してしまうでしょう。以前の私は、Excelの重複の削除機能を使っていました。数万行のデータを必死に処理していたのです。しかしファイルが重くなるとExcelが固まります。そこでPythonのpandasに目を向けました。このライブラリを使えば一瞬で終わると聞いたからです。こうして私は独学を始めました。

初めてdrop_duplicates()を使ったときのことです。コードを実行したのにデータが全く減っていなくて、しばらく意味がわかりませんでした。エラーも出ないので、なんで動かないのか手がかりすらない状態です。そのことを今でも鮮明に覚えているものです。

しかし冷静になって調べてみると原因は非常に単純でした。私にはプログラミングの経験がありません。そのためpandasの仕様が罠のように感じられたのです。この記事では重複が削除されないときのポイントを解説します。私の失敗談を交えて具体的にお伝えしましょう。コードは合っているはずなのに消えないと悩む方も多いはずです。そんな方々の助けになれば幸いです。

戻り値の罠と代入忘れ

期待していた結果が得られません。私は画面の前で固まってしまいました。確かに重複を消せという命令を書いたはずです。しかし出力されたデータには同じ行が並んだままでした。これが初心者が最初にはまる戻り値の罠です。関数を実行しても元のデータは書き換わりません。

処理前のデータ行数は15,400行でした。期待していた処理後の行数は14,800行だったのです。

日本語の文字が含まれるJupyter Notebookの画面。コードを実行した直

消えるデータ、代入忘れ

そこで私は何度もコードを書き直しました。しかし何度実行しても結果は同じです。エラーメッセージが出れば対策も練られます。しかしプログラムは正常に終了しているように見えました。幸いにもネットで役立つ記述を見つけます。関数は新しいデータを返しているだけという内容でした。実行した結果をどこかに保存する必要があります。そうしなければその成果は消えてしまうのです。深夜2時になぜデータが減らないのか悩みました。パソコンの再起動を3回も繰り返したほどです。結局は自分の書き方が悪いわけではありませんでした。仕様を理解していなかっただけだと気づきます。

そのときは安堵と同時に自分の無知さに苦笑いしました。

結局この問題は代入という操作の忘れが原因です。皆さんの画面でもデータが変わらないことがありますか。まずは実行結果を元の変数に戻しているか確認しましょう。これだけで解決する場合がほとんどです。

代入式統一の理由

次に私が悩んだのは修正の方法が2通りあることでした。一つは実行した結果を元の変数に代入し直す方法です。もう一つはカッコの中に魔法の言葉を書き込みます。inplace=Trueと指定する方法のことです。どちらを使えば良いのか分かりません。私は両方の書き方を試してみることにしました。するとどちらも確かにデータが更新されます。

日本語インターフェースのVS Codeのエディタ画面。df = df.drop_

しかし最近では代入する書き方が推奨されているようです。inplaceを使うとコードが読みにくくなるからでしょう。予期せぬ動作を引き起こすこともあります。私も最初はinplaceの方が短くて楽だと思っていました。しかし複雑な処理を重ねるうちに考えが変わります。代入式の方がデータを上書きしたという実感が持てるのです。その方が安心だと感じるようになりました。

代入式によるデータ追跡

代入式を使うとデータがどう変わったか追いかけやすくなります。一方でinplaceを多用すると中身がいつの間にか変わります。後から原因を探すのが大変になる場合もありました。そのため私は常に代入するスタイルで統一しています。どちらを使うか迷うなら代入式から始めてみてください。個人的には、コードを後で読み返したときに意図が伝わりやすいので、代入スタイルに統一してしまいました。

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

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

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

重複判定の落とし穴、subsetで回避

代入の問題を解決しても重複が残ることがあります。関数はデフォルトですべての列が一致する行を重複とみなします。しかし実務のデータでは日付だけが違うことも多いでしょう。備考欄に少しだけメモが入っていることもあります。すると人間にとっては同じデータでも削除されません。コンピュータが別のデータだと判断するからです。

日本語のExcel風の表。氏名と電話番号は同じだが、受付日時だけが数秒ずれている

そこで重要になるのがsubsetという設定です。どの列を見て重複を判断するかを指定できます。たとえば顧客IDと氏名の一致だけで重複とみなす場面を考えます。その場合は対象となる2つの列名を指定しなければなりません。私は最初この指定を忘れていました。わずかな表記の差で残ってしまったデータに悩まされます。システムが自動で付与するタイムスタンプが原因でした。1秒のズレも許されない厳しい判定が行われていたのです。売上リストの重複を消して上司に報告しました。しかし後から同じ注文が2回カウントされていると指摘されます。調べてみると注文番号は同じでした。

それなのに発送完了フラグが異なっていたのです。そのため別データとして残ってしまっていました。subsetで注文番号だけを指定していれば防げたミスです。結局私は平謝りする羽目になりました。

データ鮮度を保つkeep設定

重複が見つかったときの判断も大きな問題です。どの行を生き残らせるか決めなければなりません。ここで便利なのがkeepという設定です。これを知ることで私の作業効率はさらに上がりました。デフォルトでは一番上の行が残ります。しかし実務では一番下の行を残したい場面も多々あるでしょう。それは最新のデータを残したいときです。

住所変更の履歴が残っている名簿データを例に挙げます。この場合古い住所の行を消して最新の行を残す必要があります。そこでkeepにlastと指定してみてください。一番下の行を優先的に残せるようになります。逆に重複行をすべて消し去りたいときもあるはずです。その場合はFalseを指定することも可能です。ビジネスの目的に合わせて残す行を柔軟に選べます。これは手作業にはない大きなメリットだと感じました。

`keep`設定が左右するデータの鮮度と並び順

実際に使ってみるとデータの意味が大きく変わることに気づきます。このkeepの設定一つで結果が左右されるのです。最新のステータスを反映させたいのかを考えてみましょう。最初の登録情報を守りたいのかという判断も必要です。最初はとりあえず消えればいいと思っていました。しかしデータの鮮度を保つためにはこの設定が欠かせません。そのため私は必ずデータの並び順を確認します。その後にkeepを指定するようにしています。意図しない行が消えるならこの設定を見直してみてください。

型違いが招く重複の罠

最も厄介だった原因は型の違いによるものでした。見た目は同じなのに型が違うというケースです。たとえばある列では101という数値が入っています。別の列では文字列として保存されているとしましょう。人間が見ればどちらも同じ101です。しかしプログラムにとっては全くの別物として扱われます。その結果これらは重複とは認められません。

日本語のJupyter Notebook画面。df.info()の実行結果が表示

CSVを読み込むときに型が自動判別されることがあります。しかしその判別が列ごとに異なると悲劇が起こります。なぜ同じ数字なのに消えないのかと悩みました。1時間以上も画面を睨みつけたほどです。そこで各列の型を確認する命令の存在を知りました。df.dtypesを実行してみたのです。これでようやく原因を突き止めることができました。商品コードの重複を消そうとしたときのことです。一部のコードにだけハイフンが含まれていました。そのため数値の列と文字列の列が混在してしまいます。何度処理してもエラーは出ません。重複が消えない不気味な現象に背筋が凍りました。

型を統一する一行を加えた瞬間にすべてが解決したのです。

重複削除の黄金パターンと確認

実務で頻繁に使うのは特定の列を組み合わせる書き方です。これまでの失敗を経て黄金パターンを確立できました。まずsubsetに重要な列のリストを渡します。次にkeepで残す行を指定しましょう。最後に結果を変数に代入するという流れになります。この一連の動作をテンプレート化してみてください。私の場合これでミスが劇的に減りました。

手作業で重複を探していた頃は3時間もかかりました。しかしPythonで自動化した現在はわずか1分です。

日本語のコメントが付いたPythonコード。subset=['社員番号', '日

重複を削除した後は行番号が歯抜けになってしまいます。そこで最後にreset_indexを付け加えましょう。これを実行するのが私の小さなこだわりです。データが綺麗に整列してエラーが起きにくくなります。その後の処理もずっと楽になるはずです。このひと手間が後々の作業をスムーズにする秘訣です。

削除する前にどの行が重複しているか確認したいこともあるでしょう。そのときはduplicated関数を使うのが便利です。いきなり消すのが怖い場面もよくあります。まず重複している行だけを画面に出してみてください。自分の目で確認する習慣をつけることをおすすめします。慎重に手順を踏んで誤削除のリスクを抑えましょう。確実な処理こそが使い続けるための自信に繋がります。

エラーが出ない時の確認手順とデータ処理の喜び

最後に処理が効かないと焦ったときの確認手順をまとめます。まず実行結果を元の変数に代入しているか確認しましょう。次にsubsetの指定が適切か見直してください。重複を判断する列を正しく選んでいるかのチェックです。そしてデータの型が一致しているかも確認します。この3点を確認するだけでほとんどのトラブルは解決できるでしょう。

実は私も最初はPythonを諦めそうになりました。しかし原因を紐解いていけば論理的な理由が見つかります。エラーが出ないからこそ難しい面もあるでしょう。それを乗り越えたときの爽快感は格別です。手作業では決して味わえない大きな喜びがあります。数万行のデータが一瞬にして綺麗になる瞬間を想像してください。数行のコードを書くだけで自分の仕事が進化したように感じます。

コードの悩み、冷静な見直しとヒント

今あなたが画面の前で悩んでいるなら深呼吸をしてみましょう。そしてもう一度冷静にコードを見直してみてください。小さな書き間違いや仕様の勘違いが隠れているだけです。この記事で紹介した私の失敗が少しでもヒントになれば幸いです。あなたの作業を楽にする助けになることを願っています。自分も最初はエラーすら出ないトラブルが一番つらかったですが、こういう地道な確認の積み重ねで少しずつ慣れてきました。同じ状況で悩んでいる方の参考になればうれしいです。

無料プレゼント

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

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

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

¥980 ミニキット

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

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

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

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

関連書籍

Python・pandas関連書籍を、手元で見返せる形にしておきたい場合

pandasのエラー対応は、似た症状を何度も見返すことが多いです。データ前処理や型変換を手元で確認できる本を1冊置いておくと、調べ直しの時間を減らしやすいです。

Python・pandas関連書籍をAmazonで探す

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

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

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

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

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


1問だけ回答する