データに重複した行が含まれていることがあります。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() で削除するという流れが安全です。