pandas で重複行を削除する(drop_duplicates)

データに重複した行が含まれていることがあります。pandas の drop_duplicates を使えば、重複行を簡単に削除できます。

基本的な使い方

drop_duplicates() を呼び出すと、完全に一致する行が削除されます。

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Alice', 'Charlie'],
    'age': [25, 30, 25, 35]
})

result = df.drop_duplicates()
print(result)

name=‘Alice’, age=25 の行が重複しているので、1 つだけ残ります。デフォルトでは最初の行が保持されます。

特定の列だけで判定する

subset パラメータで、重複を判定する列を指定できます。

df = pd.DataFrame({
    'name': ['Alice', 'Alice', 'Bob'],
    'age': [25, 30, 25],
    'city': ['Tokyo', 'Osaka', 'Tokyo']
})

# name だけで重複を判定
result = df.drop_duplicates(subset=['name'])
print(result)

この場合、name が Alice の行が 2 つありますが、最初の行だけが残ります。age や city が違っていても、name が同じなら重複と判定されます。

複数の列を指定することもできます。

# name と city の組み合わせで重複を判定
result = df.drop_duplicates(subset=['name', 'city'])

残す行を変更する

keep パラメータで、どの行を残すかを指定できます。

説明
first最初の行を残す(デフォルト)
last最後の行を残す
False重複している行をすべて削除
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Alice'],
    'score': [80, 90, 85]
})

# 最後の行を残す
df.drop_duplicates(subset=['name'], keep='last')

# 重複している行をすべて削除(Alice の行が両方消える)
df.drop_duplicates(subset=['name'], keep=False)

元のデータフレームを変更する

デフォルトでは新しいデータフレームが返されます。元のデータフレームを直接変更したい場合は inplace=True を指定します。

df.drop_duplicates(inplace=True)

ただし、inplace の使用は可読性が下がるため、新しいデータフレームを受け取るほうが推奨されています。

重複を確認する

削除する前に、どの行が重複しているか確認したいこともあります。duplicated() メソッドを使うと、重複している行を True で返します。

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Alice'],
    'age': [25, 30, 25]
})

# 重複している行を確認
print(df.duplicated())

# 重複している行だけを表示
print(df[df.duplicated()])

# 重複している行を数える
print(df.duplicated().sum())

duplicated()keep パラメータを受け付けるので、最初の出現を重複と見なすか、すべてを重複と見なすかを選べます。

データのクレンジングでは、まず duplicated() で重複を確認し、問題なければ drop_duplicates() で削除するという流れが安全です。