データ解析とかをしていて、ちょくちょく出番があるので備忘録的に残しておく。
要素の抽出方法
要素の抽出自体は過去記事を参照
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"])
df.duplicated()
DataFrameに対してduplicated()
メソッドを呼び出すと、行ごとに各列要素すべてが重複するかを判定したSeriesを返してくれる。なお、重複していると判定されたものはTrue
となる。
ちなみに、列ごとに判定したい時はDataFrameをT
で転置してからduplicated()
を呼び出せばよい。
df.T.duplicated()
判定結果のルール指定
duplicated()
メソッドにはkeep
というオプションがあり、以下の3種類から判定ルールを選択できる。
種類 | 説明 | 使用例 |
---|---|---|
"first"(デフォルト) | 重複要素の先頭のみFalseと判定する | |
"last" | 重複要素の末尾のみFalseと判定する | |
False | 重複要素はすべてTrueと判定する |
今のところ、仕事ではデフォルトのルール以外の出番はないが、そのうち出番はありそうな気がする。
特定列のみで判定
DataFrameのduplicated()
メソッドにはsubset
というオプションがあり、判定対象にしたい列名を与えると、その列だけで判定してくれる。
複数の列を指定したい時は、リストなどでくくって渡すこともできる。
ちなみに、Seriesにもduplicated()
メソッドがあるので、DataFrameから特定列のSeriesを作ってからduplicated()
を呼び出す方法もある。
時間を計ってみたらSeriesにしてから判定するほうが、$\frac{1}{4}$くらい早かった。
重複要素を取り除く
前述のduplicated()
メソッドを使うと重複要素を取り除ける。
duplicated()
メソッドは**重複している要素がTrue
になるので、~
で反転すれば重複要素以外がTrue
**になる。
df[~df.duplicated()]
重複する要素を完全に除外するなら、duplicated()
のkeep
オプションにFalse
を指定すればよい。
df[~df.duplicated(keep=False)]
インデックスを込みで重複要素を取り除く
スクリプト内で作るデータだとどうにでもできるが、既にある対象データを読み込んで解析する時なんかは、インデックスにしている同じIDに複数の要素に紐づいているときなどがある。
インデックスをリセットすれば一応ユニークなIDになるが、DataFrameをデータベース的に使うときなどは、自動で割り振られたインデックスでは使いにくいので、できればそのまま判定したい。
df[~((df.index.duplicated()) & (df.duplicated()))]
今のサンプルでは変化がわからないので、サンプルのインデックスを変更する。
ちなみに、重複要素を取り除くだけなら**drop_duplicates()
というメソッドもある**。このメソッドは重複値を除いたDataFrameを返してくれる。
なお、duplicated()
メソッドと同様にsubset
,keep
オプションを持っていて判定ルールは同じように設定できて、加えてinplace
というオプションにTrue
を指定すると、元のDataFrame(Series)を直接変更する。
処理時間はどっちを使っても同じくらいらしい。
終わりに
重複判定は結構出番があるのでまとめてみた。