Python

pandas.DataFrameで重複行を検出・削除する方法

pandasのデータフレームで重複データがあるみたい。見つけて削除したい。


表形式のデータを扱うのに便利なpandas.DataFrame

DataFrameで扱うデータには重複した要素を含んでいることがある。

重複データは場合によっては必要ないことがあるので、重複データがあるか確認して削除したい。

しかしどうやって重複行を検出して削除すればいいのか。

そこで今回はpandas.DataFrameで重複行を検出・削除する方法について紹介する。

この記事を書いている人


システムエンジニア、AIエンジニアと、IT業界で10年以上働いている中堅。PythonとSQLが得意。

記事を読むメリット

pandas.DataFrameで重複行を検出・削除する方法がわかり、pandasで重複データを扱うのが苦手ではなくなる


pandas.DataFrameで重複行を検出・削除する方法

ではどのようにpandas.DataFrameで重複行を検出・削除するのか。

方法としては以下のようなものがある。

重複検出・削除方法

  • 重複行の検出:duplicated()
  • 重複行の削除:drop_duplicates()

それぞれ以下のデータを例に解説する。

DATA

import pandas as pd

data_list1 = [
["a",12,100],
["a",12,100],
["c",12,90],
["d",13,85],
["d",13,85],
["e",14,95]
]
col_list1 = ["id","age","score"]
df1 = pd.DataFrame(data=data_list1, columns=col_list1)
print(df1)

#   id  age  score
# 0  a   12    100
# 1  a   12    100
# 2  c   12     90
# 3  d   13     85
# 4  d   13     85
# 5  e   14     95



重複行の検出:duplicated()

重複行を検出するには duplicated() を用いる。

duplicated() を使用すると、各行に対するbool値が返ってくる。

重複している行のうち最初をオリジナルとしてそれ以外を重複行として判定している。

SAMPLE

print(df1.duplicated())

# 0    False
# 1     True
# 2    False
# 3    False
# 4     True
# 5    False
# dtype: bool


bool値でデータフレームをマスクすると、重複した行を抽出できる。

print(df1[df1.duplicated()])

#   id  age  score
# 1  a   12    100
# 4  d   13     85



残す行をkeepで指定

duplicated() を引数無しで使用すると重複行のうち最初の行が False として重複していない扱いになったが、 keep="last" を指定すると最後の行を False として残すことができる。
(デフォルトは keep="first"

SAMPLE

print(df1.duplicated(keep="last"))

# 0     True
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# dtype: bool

print(df1[df1.duplicated(keep="last")])

#   id  age  score
# 0  a   12    100
# 3  d   13     85


ちなみに keep=False にすると、重複行は最初も最後も全て重複扱いになる。

print(df1.duplicated(keep=False))

# 0     True
# 1     True
# 2    False
# 3     True
# 4     True
# 5    False
# dtype: bool

print(df1[df1.duplicated(keep=False)])

#   id  age  score
# 0  a   12    100
# 1  a   12    100
# 3  d   13     85
# 4  d   13     85



重複を判定する列をsubsetで指定

duplicated() でそのまま重複判定をすると全部の列の値が同じ行が重複と判定される。

ここで subset=["列名"] で重複を判定する列を指定することもできる。

SAMPLE

print(df1.duplicated(subset=["age"]))

# 0    False
# 1     True
# 2     True
# 3    False
# 4     True
# 5    False
# dtype: bool

print(df1[df1.duplicated(subset=["age"])])

#   id  age  score
# 1  a   12    100
# 2  c   12     90
# 4  d   13     85



重複行の削除:drop_duplicates()

重複行を削除したい場合は drop_duplicates() を用いる。

SAMPLE

print(df1.drop_duplicates())

#   id  age  score
# 0  a   12    100
# 2  c   12     90
# 3  d   13     85
# 5  e   14     95


処理内容としては duplicated() で得られたbool値を反転させてマスクすることで「重複していない行」を抽出するのと変わらない

print(df1[~df1.duplicated()])

#   id  age  score
# 0  a   12    100
# 2  c   12     90
# 3  d   13     85
# 5  e   14     95


ちなみに duplicated() と同じように keepsubset は引数として使用可能だ。



元のデータフレームを変更するにはinplaceを指定

drop_duplicates() をしても返り値は別のデータフレームとして返ってくる。

元のデータフレームそのものを変更したい場合は inplace=True を指定すると元のデータフレームに重複削除が反映される。

SAMPLE

df1.drop_duplicates()
print(df1)

#   id  age  score
# 0  a   12    100
# 1  a   12    100
# 2  c   12     90
# 3  d   13     85
# 4  d   13     85
# 5  e   14     95

df1.drop_duplicates(inplace=True)
print(df1)

#   id  age  score
# 0  a   12    100
# 2  c   12     90
# 3  d   13     85
# 5  e   14     95



まとめ

今回はpandas.DataFrameで重複行を検出・削除する方法について説明した。

pandas.DataFrameで重複行を検出・削除するには以下のような方法がある。

重複検出・削除方法

  • 重複行の検出:duplicated()
  • 重複行の削除:drop_duplicates()

それぞれ keep="first" や keep="last" で重複している行のうちどこをオリジナル扱いするかを指定でき、subset=["列名"] で重複を判定する列を指定することもできる。


データ処理では結構使うので関数の存在は覚えていたほうが良いですね




他にもpandas関連の記事もあるので、もし気になったら見てみて欲しい。

ITipsと同じようなブログを作る方法

ブログに興味がありますか?

もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

ランキング参加中

にほんブログ村 IT技術ブログへ

他にもブログやSNSで紹介してくれると励みになります。

はてブのコメントで酷評されると泣きます(´;ω;`)

-Python
-

© 2023 ITips