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 の方がお手軽か。
今回はこんなところで。