【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=Nonekeep=’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: bool

1.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=Nonekeep=’first’inplace=Falseignore_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=Nonedrop=Falseinplace=Falsecol_level=0col_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公式ドキュメント:

機械学習・データ処理を学ぶのにおすすめの教材

動画で学習するなら!

本気で取り組むならまずは相談!

じっくり書籍で学習するなら!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる