【Pandasデータ整形術】DataFrame・Seriesの重複データを抽出・削除する方法
データ分析において、データセットに含まれる重複した行や値は、集計結果を歪ませたり、分析の精度を低下させたりする原因となります。そのため、効率的に重複データを見つけて処理することは、データクレンジングの重要なステップです。Pandasは、DataFrameやSeries内の重複データを検出し、抽出・削除するための便利なメソッドを提供しています。この記事では、重複データの検出から削除までの主要なテクニックを、短いサンプルコードと丁寧な解説を交えてご紹介します。
なぜ重複データを処理する必要があるのか?
重複データを処理する主な理由は以下の通りです。
-
分析の正確性向上: 重複するデータポイントがあると、統計量(合計、平均、カウントなど)が不正確になる可能性があります。
-
例: 顧客リストに同じ顧客が複数回登録されていると、顧客数を誤ってカウントしてしまう。
-
-
モデル性能の改善: 機械学習モデルの訓練データに重複が含まれていると、モデルが過学習(特定のデータに過剰に適合)したり、テストデータの評価が不正確になったりする可能性があります。
-
ストレージ効率: 不要な重複データを削除することで、データの保存容量を削減できます。
-
整合性の維持: データの一貫性を保ち、信頼性の高い分析結果を得るために、重複の解消は不可欠です。
重複している行を検出する: duplicated()
duplicated()メソッドは、DataFrameまたはSeriesの各行(または要素)が重複しているかどうかをブール値(True/False)で示します。
DataFrameの重複行を検出する
デフォルトでは、duplicated()は**最初の出現をFalseとし、2回目以降の重複をTrue**と判定します。
import pandas as pd
# サンプルDataFrameの作成
df = pd.DataFrame({
'ID': [1, 2, 1, 3, 2],
'商品名': ['りんご', 'みかん', 'りんご', 'バナナ', 'みかん'],
'価格': [100, 120, 100, 80, 120]
})
print("オリジナルDataFrame:\n", df)
# 重複している行を検出
# デフォルトで最初の出現はFalse
duplicated_rows = df.duplicated()
print("\n重複行の検出結果 (duplicated()):\n", duplicated_rows)
# 重複行を抽出して表示 (Trueの行をフィルタリング)
df_show_duplicates = df[df.duplicated()]
print("\n重複している行のみ抽出:\n", df_show_duplicates)
解説:
-
df.duplicated()は、各行が以前の行と全く同じ内容である場合にTrueを返します。 -
df[df.duplicated()]とすることで、実際に重複していると判定された行(インデックス2と4の行)のみを抽出して表示できます。
最初の出現も含めて全ての重複を検出する: keep='False'
デフォルトのkeep='first'では最初の出現がFalseになりますが、keep=Falseを設定すると**全ての重複している行(最初の出現も含む)をTrue**と判定できます。
# 全ての重複している行をTrueと判定
duplicated_all = df.duplicated(keep=False)
print("\n全ての重複行を検出 (keep=False):\n", duplicated_all)
# 全ての重複行を抽出して表示
df_show_all_duplicates = df[df.duplicated(keep=False)]
print("\n全ての重複行を抽出:\n", df_show_all_duplicates)
解説:
keep=Falseを使うことで、データセット内の全ての重複グループを網羅的に確認することができます。
特定の列に基づいて重複を検出する: subset引数
DataFrame全体ではなく、特定の列の組み合わせが重複しているかどうかを検出したい場合にsubset引数を使用します。
# 'ID'と'商品名'列の組み合わせで重複を検出
duplicated_subset = df.duplicated(subset=['ID', '商品名'])
print("\n'ID'と'商品名'の組み合わせでの重複検出:\n", duplicated_subset)
# 'ID'と'商品名'の組み合わせで重複している行を抽出
df_show_subset_duplicates = df[df.duplicated(subset=['ID', '商品名'])]
print("\n'ID'と'商品名'の組み合わせで重複している行:\n", df_show_subset_duplicates)
解説:
subset=[‘ID’, ‘商品名’]とすることで、’ID’列と’商品名’列の値の組み合わせが同じ場合に重複と判定されます。この場合、インデックス2の行はインデックス0の行とIDも商品名も同じなので重複と判定されます。
重複した行を削除する: drop_duplicates()
drop_duplicates()メソッドは、DataFrameまたはSeriesから重複している行(要素)を削除し、ユニークなデータのみを残します。
DataFrameの重複行を削除する
デフォルトでは、drop_duplicates()は最初の重複を残し、それ以降の重複を削除します。
# 重複行を削除 (デフォルトで最初の出現を残す)
df_deduplicated = df.drop_duplicates()
print("\n重複行を削除後 (drop_duplicates()):\n", df_deduplicated)
解説:
インデックス2と4の重複行が削除され、最初の出現であるインデックス0と1の行は残っています。
最後の重複を残す: keep='last'
重複グループの中で、最後の出現のみを残したい場合はkeep='last'を指定します。
# 最後の重複を残して削除
df_deduplicated_last = df.drop_duplicates(keep='last')
print("\n最後の重複を残して削除後 (keep='last'):\n", df_deduplicated_last)
全ての重複を削除する: keep=False
重複グループの全ての行を削除したい(つまり、全く重複していない行のみを残したい)場合はkeep=Falseを指定します。
# 全ての重複を削除 (ユニークな行のみ残る)
df_deduplicated_none = df.drop_duplicates(keep=False)
print("\n全ての重複を削除後 (keep=False):\n", df_deduplicated_none)
特定の列に基づいて重複を削除する: subset引数
duplicated()と同様に、drop_duplicates()でもsubset引数を使って、特定の列の組み合わせに基づいて重複を削除できます。
# 'ID'と'商品名'の組み合わせで重複を削除
df_deduplicated_subset = df.drop_duplicates(subset=['ID', '商品名'])
print("\n'ID'と'商品名'の組み合わせで重複を削除後:\n", df_deduplicated_subset)
Seriesでの重複処理
DataFrameと同様に、Seriesに対してもduplicated()とdrop_duplicates()を適用できます。
# サンプルSeriesの作成
s = pd.Series(['A', 'B', 'A', 'C', 'B'])
print("\nオリジナルSeries:\n", s)
# Seriesの重複要素を検出
s_duplicated = s.duplicated()
print("\nSeriesの重複検出:\n", s_duplicated)
# Seriesの重複要素を削除
s_deduplicated = s.drop_duplicates()
print("\nSeriesの重複削除:\n", s_deduplicated)
まとめ
Pandasのduplicated()とdrop_duplicates()メソッドは、データセット内の重複データを効率的に検出・処理するための不可欠なツールです。duplicated()で重複している行を特定し、drop_duplicates()でそれらを削除することで、データの品質を高め、分析の正確性を保証することができます。keep引数('first', 'last', False)やsubset引数を使いこなすことで、様々な重複処理のニーズに対応できるでしょう。これらの機能を活用して、あなたのデータクレンジング作業を効率化し、より信頼性の高い分析結果を得ましょう。
