このエントリーをはてなブックマークに追加

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 の方がお手軽か。

今回はこんなところで。