42
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

要素の抽出方法

要素の抽出自体は過去記事を参照
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

終わりに

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

42
51
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?