【pandas】データフレームの重複した行の抽出・削除を行う方法

データを分析する際の前処理として、重複行の確認・削除は重要です。pandasでよく使われる
df.duplicated()df.drop_duplicates()df.reset_index()
それぞれの関数についてまとめました。
- 重複を確認・削除したい
- 重複の抽出をしたい
- インデックスを振りなおしたい
サンプルデータは下記のように作成しました。
import pandas as pd
df = pd.DataFrame({
'prefecture': ['東京都', '東京都', '神奈川県', '北海道', '北海道'],
'name': ['saki', 'saki', 'takeshi', 'toshi', 'kei'],
'age': [10, 10, 42, 29, 29]
})
>>> df
pre name age
0 東京都 saki 10
1 東京都 saki 10
2 神奈川県 takeshi 42
3 北海道 toshi 29
4 北海道 kei 29
重複を抽出する—df.duplicated()
DataFrame.duplicated(subset=None, keep=’first’)
返り値:各行のTrue・False
| 引数 | 意味 |
|---|---|
| subset | 初期値無し。列を指定できる。 特定列の重複のみを選択する場合は指定する。 |
| keep | 初期値='first'first:最初の値以外は重複(True)として扱うlast:最後の値以外は重複(True)として扱うFalse:重複する値全てを重複として扱う |
完全に重複した行を確認する
引数を指定しない場合は、完全重複した行で最初の値以外は重複(True)となります。
>>> df.duplicated()
0 False
1 True
2 False
3 False
4 False
dtype: bool1.2行目が完全重複なので、2行目がTrueとなりました。
特定列の重複を確認する—subset
完全重複でもなく、特定の列のみの重複を確認する場合はsubset=[column]で指定します。
>>> df.duplicated(subset=['pre'])
0 False
1 True
2 False
3 False
4 True
dtype: bool複数カラムの場合はリストで渡します。
>>> df.duplicated(subset=['pre','age'])
0 False
1 True
2 False
3 False
4 True
dtype: bool重複の扱い方を変更する—keep
初期値ではfirst:2つ目の重複から「False」となります。
全ての重複をTrueとする場合にはkeep=Falseとします。
>>> df.duplicated(subset=['pre'], keep=False)
0 True
1 True
2 False
3 True
4 True
dtype: boolこれで重複しているpre(都道府県)の「東京都・北海道」がTrueとなり、重複していない神奈川県がFalseとなりました。
重複した行を抽出する方法
重複している行を抽出する方法は簡単です。
重複内容を新しいデータフレームとして定義するだけです。
duplicated_df = df[df.duplicated(subset=['pre'], keep=False)]
>>> duplicated_df
pre name age
0 東京都 saki 10
1 東京都 saki 10
3 北海道 toshi 29
4 北海道 kei 29これで任意の重複行を抽出できます。
重複を削除する—df.drop_duplicates()
DataFrame.drop_duplicates(subset=None, keep=’first’, inplace=False, ignore_index=False)
返り値:データフレームもしくは無し
| 引数 | 意味 |
|---|---|
| subset | 初期値無し。列を指定できる。 特定列の重複のみを選択する場合は指定する。 |
| keep | 初期値='first'first:最初の値以外は重複(True)として扱うlast:最後の値以外は重複(True)として扱うFalse:重複する値全てを重複として扱う |
df.duplicated()と同様です。返り値が重複を除いたデータフレームとなります。
完全重複を削除
>>> df.drop_duplicates()
pre name age
0 東京都 saki 10
2 神奈川県 takeshi 42
3 北海道 toshi 29
4 北海道 kei 29重複行の2行目が削除されました。
特定列の重複を削除
特定の列の重複を確認する場合には、subset=[]で指定します。
>>> df.drop_duplicates(subset=['pre','age'])
pre name age
0 東京都 saki 10
2 神奈川県 takeshi 42
3 北海道 toshi 29全ての重複行を除いてみます。
>>> df.drop_duplicates(subset=['pre'], keep=False)
pre name age
2 神奈川県 takeshi 42データフレームの上書き
元のデータフレームを上書きする場合にはinplace=Trueを指定します。
df.drop_duplicates(inplace=True)インデックスの振り直し—reset_index()
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)
重複を削除した際に、併せて行いたいのがインデックスの振り直しです。
drop=Trueとすることで、元のインデックスが削除されます。また、データフレームの上書きはinplace=Trueで指定。
>>> df.drop_duplicates(inplace=True)
>>> df
index prefecture name age
0 東京都 saki 10
2 神奈川県 takeshi 42
3 北海道 toshi 29
4 北海道 kei 29上記のように重複削除後にはインデックス番号がバラバラなので振りなおします。
>>> df.reset_index(drop=True, inplace=True)
>>> df
index prefecture name age
0 東京都 saki 10
1 神奈川県 takeshi 42
2 北海道 toshi 29
3 北海道 kei 29インデックスが振りなおされました。
参考
pandas公式ドキュメント:
機械学習・データ処理を学ぶのにおすすめの教材
じっくり書籍で学習するなら!

コメント