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

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

データを分析する際の前処理として、重複行の確認・削除は重要です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公式ドキュメント:

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

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

¥3,608 (2024/11/10 16:43時点 | Amazon調べ)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次