Python で解析 14

“Advent Calendar 2013 - Python で解析!” の十四日目。DataFrame - 9

1. データの準備

今回取り上げるのは duplicated。レコードの重複を取り除く。

誤って同じデータを取り込んでしまったとか、ログ解析でユニークユーザーに絞りたいなど…のようなシチュエーションで、必要になるデータ操作だ。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({
   ...:   'name': [u'山田', u'鈴木', u'山田', u'鈴木'],
   ...:   'height': [166, 155, 168, 170]
   ...: })

In [3]: df
Out[3]:
   height name
0     166   山田
1     155   鈴木
2     168   山田
3     170   鈴木

2. なにはともあれ試してみる

とにもかくにも実行してみる。

In [4]: df.duplicated()
Out[4]:
0    False
1    False
2    False
3    False
dtype: bool

すべて False で重複しているレコードは存在しないことが分かる。これは、各レコードのすべての項目を比較して、一致していなければ False となるので、サンプルデータだと重複レコードは存在しないことになるわけだ。'name' カラムには重複データがあるので、'name' に限定して duplicated を実行してみる。

In [5]: df.name.duplicated()
Out[5]:
0    False
1    False
2     True
3     True
Name: name, dtype: bool

上から順に判定して行って、初めて登場する name なら False で、二回目に登場する時に True になっていることが分かる。

3. 重複データを取り除く


では、重複データを取り除いてみる。

In [6]: df[df.name.duplicated() == False]
Out[6]:
   height name
0     166   山田
1     155   鈴木

重複していないものについてフィルターをかけてみた。drop_duplicates というメソッドも用意されているので、そちらを使っても良い。

In [7]: df.drop_duplicates(['name'])
Out[7]:
   height name
0     166   山田
1     155   鈴木

同じ結果になった。

この例では、重複しているレコードのうち、最初に出現したものを抜き出しているが、最後に出現したものを抜き出すこともできる。

In [8]: df.drop_duplicates(['name'], take_last=True)
Out[8]:
   height name
2     168   山田
3     170   鈴木

drop_duplicates を使わずに、フィルターを使う方法でやる場合は、先に逆順に並べ替えてやればいいのだが、 drop_duplicates の方がお手軽か。

今回はこんなところで。