データ分析における、データの前処理として前回は欠損値の扱いについて説明したが、今回はデータセット内で重複するデータを除去するpandasのメソッドについて詳しく紹介する。

重複データの除去

下記のようなデータフレームがあったとする。

import pandas as pd

df = pd.DataFrame({'k1': ['a', 'b'] * 3 + ['b'],
                  'k2': [1, 1, 2, 3, 3, 4, 4]})

#   k1  k2
# 0  a   1
# 1  b   1
# 2  a   2
# 3  b   3
# 4  a   3
# 5  b   4
# 6  b   4

末尾2行のデータが重複したテスト用データセットだ。

重複を確認するduplicatedメソッド

データフレームのduplicatedメソッドは、重複したデータがあるか(同じ値を持つ行が前にあるか)を真偽値のシリーズで返す。

df.duplicated()
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

また、関連メソッドとしてdrop_duplicatesメソッドがあるが、これは重複する行を削除したデータフレームを返す。
つまり、先述の真偽値でFalseの行のみを取り出すということだ。

df.drop_duplicates()
#   k1  k2
# 0  a   1
# 1  b   1
# 2  a   2
# 3  b   3
# 4  a   3
# 5  b   4

通常、duplicatedメソッド、drop_duplicatesメソッドは重複するデータの最初の行を残すようになっているが、オプション値の指定により最後の行を残すこともできる。

df.duplicated(keep='last')
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5     True
# 6    False
# dtype: bool

重複の検出対象を任意の列に指定する

duplicatedメソッド、drop_duplicatesメソッドは、どちらもデフォルトでは全ての列が同じ値の場合を重複とみなすが、重複の検出対象を任意の列に指定することもできる。

df.duplicated(['k1'])
# 0    False
# 1    False
# 2     True
# 3     True
# 4     True
# 5     True
# 6     True
# dtype: bool

df.drop_duplicates(['k2'])
#   k1  k2
# 0  a   1
# 2  a   2
# 3  b   3
# 5  b   4