
Advent Calendar 2013 - 14
Python で解析! - DataFrame 9
今回取り上げるのは duplicated。レコードの重複を取り除く。誤って同じデータを取り込んでしまったとか、ログ解析でユニークユーザーに絞りたいなど…のようなシチュエーションで、活用できるデータ操作だ。
1. データの準備
では、いつもの通りのデータの準備を。
import pandas as pd
df = pd.DataFrame({
'name': [u'山田', u'鈴木', u'山田', u'鈴木'],
'height': [166, 155, 168, 170]
})
height name
0 166 山田
1 155 鈴木
2 168 山田
3 170 鈴木
2. なにはともあれ試してみる
とにもかくにも実行してみる。
df.duplicated()
0 False
1 False
2 False
3 False
dtype: bool
すべて False で重複しているレコードは存在しないことが分かる。これは、各レコードのすべての項目を比較して、一致していなければ False となるので、サンプルデータだと重複レコードは存在しないことになるわけだ。'name' カラムには重複データがあるので、'name' に限定して duplicated を実行してみる。
df.name.duplicated()
0 False
1 False
2 True
3 True
Name: name, dtype: bool
上から順に判定して行って、初めて登場する name なら False で、二回目に登場する時に True になっていることが分かる。
3. 重複データを取り除く
では、重複データを取り除いてみる。
df[df.name.duplicated() == False]
height name
0 166 山田
1 155 鈴木
重複していないものについてフィルターをかけてみた。drop_duplicates というメソッドも用意されているので、そちらを使っても良い。
df.drop_duplicates(['name'])
height name
0 166 山田
1 155 鈴木
同じ結果になった。
この例では、重複しているレコードのうち、最初に出現したものを抜き出しているが、最後に出現したものを抜き出すこともできる。
df.drop_duplicates(['name'], take_last=True)
height name
2 168 山田
3 170 鈴木
drop_duplicates を使わずに、フィルターを使う方法でやる場合は、先に逆順に並べ替えてやればいいのだが、 drop_duplicates の方がお手軽か。
今回はこんなところで。