Help us understand the problem. What is going on with this article?

PandasのDataFrameやSeriesで重複要素を取り除く方法

データ解析とかをしていて、ちょくちょく出番があるので備忘録的に残しておく。

要素の抽出方法

要素の抽出自体は過去記事を参照
DataFrameやSeriesで要素を抽出する方法

重複要素を判定するメソッド

DataFrameやSeriesにはduplicated()という重複を判定するメソッドがあるので、これを利用すると重複のある要素重複要素以外を抽出することができる。

とりあえず、こんなDataFrameサンプルで試してみる。

import pandas as pd

df = pd.DataFrame([[0,1,2],[0,2,4],[0,1,2]], columns=["A","B","C"])

image.png

df.duplicated()

image.png

DataFrameに対してduplicated()メソッドを呼び出すと、行ごとに各列要素すべてが重複するかを判定したSeriesを返してくれる。なお、重複していると判定されたものはTrueとなる。
ちなみに、列ごとに判定したい時はDataFrameをTで転置してからduplicated()を呼び出せばよい。

df.T.duplicated()

判定結果のルール指定

duplicated()メソッドにはkeepというオプションがあり、以下の3種類から判定ルールを選択できる。

種類 説明 使用例
"first"(デフォルト) 重複要素の先頭のみFalseと判定する image.png
"last" 重複要素の末尾のみFalseと判定する image.png
False 重複要素はすべてTrueと判定する image.png

今のところ、仕事ではデフォルトのルール以外の出番はないが、そのうち出番はありそうな気がする。

特定列のみで判定

DataFrameのduplicated()メソッドにはsubsetというオプションがあり、判定対象にしたい列名を与えると、その列だけで判定してくれる。

image.png
複数の列を指定したい時は、リストなどでくくって渡すこともできる。
image.png
ちなみに、Seriesにもduplicated()メソッドがあるので、DataFrameから特定列のSeriesを作ってからduplicated()を呼び出す方法もある。
image.png

時間を計ってみたらSeriesにしてから判定するほうが、$\frac{1}{4}$くらい早かった。
image.png

重複要素を取り除く

前述のduplicated()メソッドを使うと重複要素を取り除ける。
duplicated()メソッドは重複している要素がTrueになるので、~で反転すれば重複要素以外がTrueになる。

df[~df.duplicated()]

image.png

重複する要素を完全に除外するなら、duplicated()keepオプションにFalseを指定すればよい。

df[~df.duplicated(keep=False)]

image.png

インデックスを込みで重複要素を取り除く

スクリプト内で作るデータだとどうにでもできるが、既にある対象データを読み込んで解析する時なんかは、インデックスにしている同じIDに複数の要素に紐づいているときなどがある。
インデックスをリセットすれば一応ユニークなIDになるが、DataFrameをデータベース的に使うときなどは、自動で割り振られたインデックスでは使いにくいので、できればそのまま判定したい。

df[~((df.index.duplicated()) & (df.duplicated()))]

image.png

今のサンプルでは変化がわからないので、サンプルのインデックスを変更する。
image.png

ちなみに、重複要素を取り除くだけならdrop_duplicates()というメソッドもある。このメソッドは重複値を除いたDataFrameを返してくれる。
なお、duplicated()メソッドと同様にsubset,keepオプションを持っていて判定ルールは同じように設定できて、加えてinplaceというオプションにTrueを指定すると、元のDataFrame(Series)を直接変更する。
処理時間はどっちを使っても同じくらいらしい。
image.png

終わりに

重複判定は結構出番があるのでまとめてみた。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away