🔍 ステップ32: 重複データの処理
重複を見つけて、データをきれいにしよう!
ステップ31では、データの加工と変換を学びました。今回は、データに含まれる重複を見つけて削除する方法を学びます。
📖 このステップで学ぶこと
・duplicated()で重複確認
・drop_duplicates()で重複削除
・重複の判定条件
・実践例:顧客データのクリーニング
🎯 1. 重複データとは?
データに同じ内容が複数回含まれていると、集計結果が間違ってしまいます。
🔰 なぜ重複が問題なのか
🚨 重複データの問題
・売上が二重にカウントされる
・顧客数が実際より多く見える
・平均値が正しく計算できない
・分析結果の信頼性が下がる
だから、分析の前に重複を見つけて削除することが大切です!
📘 重複データの例を見てみよう
コード:重複を含むデータを作成
import pandas as pd
# 重複を含むデータ
data = {
'顧客ID': [1, 2, 3, 2, 4, 1],
'名前': ['太郎', '花子', '次郎', '花子', '美咲', '太郎'],
'購入額': [5000, 3000, 4500, 3000, 6000, 5000]
}
df = pd.DataFrame(data)
print("重複を含むデータ:")
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
重複を含むデータ: 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 2 3 次郎 4500 3 2 花子 3000 4 4 美咲 6000 5 1 太郎 5000
💡 データを見てみると…
・0行目と5行目:顧客ID=1、太郎、5000円 → 完全に同じ!
・1行目と3行目:顧客ID=2、花子、3000円 → 完全に同じ!
このような重複データがあると、売上が2倍にカウントされてしまいます。
🔎 2. duplicated()で重複を確認
duplicated()は、重複している行を見つけるメソッドです。重複していればTrue、重複していなければFalseを返します。
🔰 duplicated()の基本
コード:重複をチェック
# 重複をチェック
is_duplicate = df.duplicated()
print("重複チェック:")
print(is_duplicate)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
重複チェック: 0 False 1 False 2 False 3 True 4 False 5 True dtype: bool
💡 結果の読み方
df.duplicated()
・各行が重複かどうかをTrue/Falseで返します
・最初に出てきた行は False(重複ではない)
・2回目以降に出てきた行は True(重複)
この例では:
・3行目(True):1行目と同じ内容(花子、3000円)
・5行目(True):0行目と同じ内容(太郎、5000円)
📝 重複している行だけを表示
コード:重複している行を表示
# 重複している行だけを表示
print("重複している行:")
print(df[is_duplicate])
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
重複している行: 顧客ID 名前 購入額 3 2 花子 3000 5 1 太郎 5000
💡 フィルタリングの仕組み
df[is_duplicate]
・is_duplicateがTrueの行だけを取り出します
・これで、重複している行を確認できます
📘 重複の個数を数える
コード:重複の個数を確認
# 重複している行の数
duplicate_count = df.duplicated().sum()
print(f"重複している行の数: {duplicate_count}個")
# 全体の行数
total_count = len(df)
print(f"全体の行数: {total_count}個")
# ユニークな行数
unique_count = total_count - duplicate_count
print(f"ユニークな行数: {unique_count}個")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
重複している行の数: 2個 全体の行数: 6個 ユニークな行数: 4個
💡 コードの解説
df.duplicated().sum()
・duplicated()はTrue/Falseを返します
・Pythonでは True=1、False=0 として計算できます
・sum()でTrueの数(=重複の数)を数えられます
len(df)
・DataFrameの行数を取得します
📘 特定の列だけで重複をチェック
全ての列が一致しなくても、「顧客IDだけ」「名前だけ」で重複を判定したい場合があります。
コード:特定の列で重複チェック
# 顧客IDだけで重複をチェック
id_duplicate = df.duplicated(subset=['顧客ID'])
print("顧客IDが重複している行:")
print(df[id_duplicate])
print()
# 名前だけで重複をチェック
name_duplicate = df.duplicated(subset=['名前'])
print("名前が重複している行:")
print(df[name_duplicate])
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
顧客IDが重複している行: 顧客ID 名前 購入額 3 2 花子 3000 5 1 太郎 5000 名前が重複している行: 顧客ID 名前 購入額 3 2 花子 3000 5 1 太郎 5000
💡 subsetパラメータ
df.duplicated(subset=[‘顧客ID’])
・「顧客ID」の列だけを見て重複を判定します
・他の列(名前、購入額)は無視されます
・複数列を指定することもできます:subset=[‘顧客ID’, ‘名前’]
📘 keepパラメータ:どの行を「重複」とするか
keepパラメータで、重複の判定方法を変えられます。
コード:keepパラメータの違い
# keep='first'(デフォルト):最初を残す、2回目以降が重複
first_dup = df.duplicated(keep='first')
print("keep='first'(最初を残す):")
print(df[first_dup])
print()
# keep='last':最後を残す、最初が重複
last_dup = df.duplicated(keep='last')
print("keep='last'(最後を残す):")
print(df[last_dup])
print()
# keep=False:全ての重複行を抽出
all_dup = df.duplicated(keep=False)
print("keep=False(全ての重複を抽出):")
print(df[all_dup])
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
keep='first'(最初を残す): 顧客ID 名前 購入額 3 2 花子 3000 5 1 太郎 5000 keep='last'(最後を残す): 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 keep=False(全ての重複を抽出): 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 3 2 花子 3000 5 1 太郎 5000
📌 keepパラメータのまとめ
| keep | 動作 | 使いどころ |
| ‘first’ | 最初を残す、2回目以降がTrue | 最初の登録データを残したい時 |
| ‘last’ | 最後を残す、最初がTrue | 最新のデータを残したい時 |
| False | 全ての重複行がTrue | 重複している行を全て確認したい時 |
🗑️ 3. drop_duplicates()で重複を削除
drop_duplicates()は、重複している行を削除するメソッドです。
🔰 基本的な重複削除
コード:重複を削除
# 重複を削除
df_unique = df.drop_duplicates()
print("重複削除後:")
print(df_unique)
print(f"\n元のデータ: {len(df)}行")
print(f"重複削除後: {len(df_unique)}行")
print(f"削除された行: {len(df) - len(df_unique)}行")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
重複削除後: 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 2 3 次郎 4500 4 4 美咲 6000 元のデータ: 6行 重複削除後: 4行 削除された行: 2行
💡 コードの解説
df.drop_duplicates()
・重複している行を削除した新しいDataFrameを返します
・元のdfは変更されません(非破壊的操作)
・デフォルトでは最初の行を残し、2回目以降を削除します
結果を見ると:
・0行目(太郎)は残り、5行目(重複)は削除
・1行目(花子)は残り、3行目(重複)は削除
📝 特定の列で重複を削除
コード:顧客IDで重複を削除
# より複雑なデータ
customer_df = pd.DataFrame({
'顧客ID': [1, 2, 1, 3, 2],
'名前': ['太郎', '花子', '太郎', '次郎', '花子'],
'購入日': ['2024-01-01', '2024-01-02', '2024-01-05',
'2024-01-03', '2024-01-06'],
'購入額': [5000, 3000, 4500, 6000, 3500]
})
print("元のデータ:")
print(customer_df)
# 顧客IDだけで重複を削除
id_unique = customer_df.drop_duplicates(subset=['顧客ID'])
print("\n顧客IDで重複削除:")
print(id_unique)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元のデータ: 顧客ID 名前 購入日 購入額 0 1 太郎 2024-01-01 5000 1 2 花子 2024-01-02 3000 2 1 太郎 2024-01-05 4500 3 3 次郎 2024-01-03 6000 4 2 花子 2024-01-06 3500 顧客IDで重複削除: 顧客ID 名前 購入日 購入額 0 1 太郎 2024-01-01 5000 1 2 花子 2024-01-02 3000 3 3 次郎 2024-01-03 6000
💡 subsetで特定列を指定
customer_df.drop_duplicates(subset=[‘顧客ID’])
・「顧客ID」が同じ行は重複とみなします
・顧客ID=1 の行が2つあるので、最初の1つだけ残ります
・顧客ID=2 の行が2つあるので、最初の1つだけ残ります
📘 最新のデータを残す
「最初」ではなく「最後(最新)」のデータを残したい場合は、keep=’last’を使います。
コード:最新のデータを残す
# 日付でソートしてから、最後を残す
customer_sorted = customer_df.sort_values('購入日')
print("日付でソート:")
print(customer_sorted)
latest_purchases = customer_sorted.drop_duplicates(
subset=['顧客ID'],
keep='last'
)
print("\n最新の購入データだけ残す:")
print(latest_purchases.sort_values('顧客ID'))
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
日付でソート: 顧客ID 名前 購入日 購入額 0 1 太郎 2024-01-01 5000 1 2 花子 2024-01-02 3000 3 3 次郎 2024-01-03 6000 2 1 太郎 2024-01-05 4500 4 2 花子 2024-01-06 3500 最新の購入データだけ残す: 顧客ID 名前 購入日 購入額 2 1 太郎 2024-01-05 4500 4 2 花子 2024-01-06 3500 3 3 次郎 2024-01-03 6000
💡 最新データを残す手順
1. sort_values(‘購入日’)
・購入日で古い順にソートします
2. drop_duplicates(subset=[‘顧客ID’], keep=’last’)
・顧客IDで重複を削除
・keep=’last’で最後(ソート後なので最新)を残す
結果:
・顧客ID=1:1/5の4500円(最新)が残る
・顧客ID=2:1/6の3500円(最新)が残る
📘 複数の列で重複を判定
コード:複数列で重複削除
# 商品と地域の組み合わせで重複を削除
sales_df = pd.DataFrame({
'商品': ['りんご', 'バナナ', 'りんご', 'みかん', 'バナナ'],
'地域': ['東京', '大阪', '東京', '名古屋', '大阪'],
'売上': [1200, 900, 1500, 800, 1100]
})
print("元のデータ:")
print(sales_df)
# 商品と地域の組み合わせで重複を削除
unique_sales = sales_df.drop_duplicates(subset=['商品', '地域'])
print("\n商品×地域で重複削除:")
print(unique_sales)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元のデータ: 商品 地域 売上 0 りんご 東京 1200 1 バナナ 大阪 900 2 りんご 東京 1500 3 みかん 名古屋 800 4 バナナ 大阪 1100 商品×地域で重複削除: 商品 地域 売上 0 りんご 東京 1200 1 バナナ 大阪 900 3 みかん 名古屋 800
💡 複数列での重複判定
subset=[‘商品’, ‘地域’]
・「商品」と「地域」の組み合わせが同じなら重複
・「りんご・東京」が2回あるので、最初だけ残る
・「バナナ・大阪」が2回あるので、最初だけ残る
📊 4. 重複データの分析
重複を削除する前に、どんな重複があるか分析してみましょう。
📘 どの値が重複しているか確認
コード:重複の詳細を確認
# 重複している顧客を特定(keep=Falseで全ての重複を抽出)
duplicate_customers = customer_df[
customer_df.duplicated(subset=['顧客ID'], keep=False)
].sort_values('顧客ID')
print("重複している顧客(全て表示):")
print(duplicate_customers)
# 顧客ごとの購入回数
purchase_count = customer_df.groupby('顧客ID').size()
print("\n顧客ごとの購入回数:")
print(purchase_count)
# 複数回購入している顧客
repeat_customers = purchase_count[purchase_count > 1]
print("\n複数回購入している顧客:")
print(repeat_customers)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
重複している顧客(全て表示): 顧客ID 名前 購入日 購入額 0 1 太郎 2024-01-01 5000 2 1 太郎 2024-01-05 4500 1 2 花子 2024-01-02 3000 4 2 花子 2024-01-06 3500 顧客ごとの購入回数: 顧客ID 1 2 2 2 3 1 dtype: int64 複数回購入している顧客: 顧客ID 1 2 2 2 dtype: int64
💡 分析のポイント
keep=Falseで全ての重複行を確認できます。
groupby().size()で各値の出現回数を数えられます。
これにより、「どの顧客が何回購入しているか」がわかります。
📘 重複の詳細レポート
コード:重複レポートの作成
print("="*50)
print("重複データ分析レポート")
print("="*50)
# 全体の統計
total = len(customer_df)
unique = len(customer_df.drop_duplicates(subset=['顧客ID']))
duplicates = total - unique
print(f"\n【基本情報】")
print(f"全データ数: {total}件")
print(f"ユニーク顧客数: {unique}人")
print(f"重複データ数: {duplicates}件")
print(f"重複率: {duplicates/total*100:.1f}%")
# 顧客別の詳細
print(f"\n【顧客別の購入履歴】")
customer_summary = customer_df.groupby('顧客ID').agg({
'名前': 'first',
'購入額': ['count', 'sum', 'mean']
})
print(customer_summary)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
==================================================
重複データ分析レポート
==================================================
【基本情報】
全データ数: 5件
ユニーク顧客数: 3人
重複データ数: 2件
重複率: 40.0%
【顧客別の購入履歴】
名前 購入額
first count sum mean
顧客ID
1 太郎 2 9500 4750.0
2 花子 2 6500 3250.0
3 次郎 1 6000 6000.0
💼 5. 実践例:顧客データのクリーニング
📘 例1:完全重複の削除
コード:顧客マスタの重複削除
# 顧客マスタデータ(重複あり)
customer_master = pd.DataFrame({
'顧客ID': [1, 2, 3, 2, 4, 1, 5],
'名前': ['山田太郎', '佐藤花子', '鈴木次郎', '佐藤花子',
'田中美咲', '山田太郎', '高橋健太'],
'メール': ['yamada@ex.com', 'sato@ex.com', 'suzuki@ex.com',
'sato@ex.com', 'tanaka@ex.com', 'yamada@ex.com',
'takahashi@ex.com'],
'登録日': ['2024-01-01', '2024-01-05', '2024-01-10',
'2024-01-05', '2024-01-15', '2024-01-01',
'2024-01-20']
})
print("元のデータ:")
print(customer_master)
# 完全重複を削除
cleaned = customer_master.drop_duplicates()
print("\n完全重複を削除:")
print(cleaned)
print(f"\n削除された行: {len(customer_master) - len(cleaned)}行")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元のデータ: 顧客ID 名前 メール 登録日 0 1 山田太郎 yamada@ex.com 2024-01-01 1 2 佐藤花子 sato@ex.com 2024-01-05 2 3 鈴木次郎 suzuki@ex.com 2024-01-10 3 2 佐藤花子 sato@ex.com 2024-01-05 4 4 田中美咲 tanaka@ex.com 2024-01-15 5 1 山田太郎 yamada@ex.com 2024-01-01 6 5 高橋健太 takahashi@ex.com 2024-01-20 完全重複を削除: 顧客ID 名前 メール 登録日 0 1 山田太郎 yamada@ex.com 2024-01-01 1 2 佐藤花子 sato@ex.com 2024-01-05 2 3 鈴木次郎 suzuki@ex.com 2024-01-10 4 4 田中美咲 tanaka@ex.com 2024-01-15 6 5 高橋健太 takahashi@ex.com 2024-01-20 削除された行: 2行
📘 例2:メールアドレスで重複を削除
コード:メールで重複削除(最初の登録を残す)
# メールアドレスが重複している複雑なケース
email_df = pd.DataFrame({
'顧客ID': [1, 2, 3, 4, 5],
'名前': ['山田太郎', '山田太郎', '佐藤花子', '佐藤はな子', '鈴木次郎'],
'メール': ['yamada@ex.com', 'yamada@ex.com', 'sato@ex.com',
'sato@ex.com', 'suzuki@ex.com'],
'登録日': ['2024-01-01', '2024-01-15', '2024-01-05',
'2024-01-20', '2024-01-10']
})
print("元のデータ:")
print(email_df)
# メールアドレスで重複を削除(最初の登録を残す)
email_df_sorted = email_df.sort_values('登録日')
email_unique = email_df_sorted.drop_duplicates(
subset=['メール'],
keep='first'
)
print("\nメールで重複削除(最初の登録を残す):")
print(email_unique.sort_index())
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元のデータ: 顧客ID 名前 メール 登録日 0 1 山田太郎 yamada@ex.com 2024-01-01 1 2 山田太郎 yamada@ex.com 2024-01-15 2 3 佐藤花子 sato@ex.com 2024-01-05 3 4 佐藤はな子 sato@ex.com 2024-01-20 4 5 鈴木次郎 suzuki@ex.com 2024-01-10 メールで重複削除(最初の登録を残す): 顧客ID 名前 メール 登録日 0 1 山田太郎 yamada@ex.com 2024-01-01 2 3 佐藤花子 sato@ex.com 2024-01-05 4 5 鈴木次郎 suzuki@ex.com 2024-01-10
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:重複の確認(初級)
📋 問題
以下のデータで重複している行を見つけてください。
df = pd.DataFrame({
'商品': ['りんご', 'バナナ', 'みかん', 'バナナ', 'りんご'],
'価格': [100, 150, 80, 150, 100]
})
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import pandas as pd
df = pd.DataFrame({
'商品': ['りんご', 'バナナ', 'みかん', 'バナナ', 'りんご'],
'価格': [100, 150, 80, 150, 100]
})
print("元のデータ:")
print(df)
# 重複をチェック
is_dup = df.duplicated()
print("\n重複チェック:")
print(is_dup)
# 重複している行を表示
print("\n重複している行:")
print(df[is_dup])
print(f"\n重複数: {is_dup.sum()}個")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元のデータ: 商品 価格 0 りんご 100 1 バナナ 150 2 みかん 80 3 バナナ 150 4 りんご 100 重複チェック: 0 False 1 False 2 False 3 True 4 True dtype: bool 重複している行: 商品 価格 3 バナナ 150 4 りんご 100 重複数: 2個
問題2:重複の削除(初級)
📋 問題
問題1のデータから重複を削除してください。
解答例を見る
コード
# 重複を削除
df_unique = df.drop_duplicates()
print("重複削除後:")
print(df_unique)
print(f"\n元のデータ: {len(df)}行")
print(f"削除後: {len(df_unique)}行")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
重複削除後: 商品 価格 0 りんご 100 1 バナナ 150 2 みかん 80 元のデータ: 5行 削除後: 3行
問題3:特定列で重複削除(中級)
📋 問題
以下のデータから、「顧客ID」が重複している行を削除してください。
df = pd.DataFrame({
'顧客ID': [1, 2, 1, 3, 2],
'名前': ['太郎', '花子', '太郎', '次郎', '花子'],
'購入額': [5000, 3000, 4500, 6000, 3500]
})
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import pandas as pd
df = pd.DataFrame({
'顧客ID': [1, 2, 1, 3, 2],
'名前': ['太郎', '花子', '太郎', '次郎', '花子'],
'購入額': [5000, 3000, 4500, 6000, 3500]
})
print("元のデータ:")
print(df)
# 顧客IDで重複削除
df_unique = df.drop_duplicates(subset=['顧客ID'])
print("\n顧客IDで重複削除:")
print(df_unique)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元のデータ: 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 2 1 太郎 4500 3 3 次郎 6000 4 2 花子 3500 顧客IDで重複削除: 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 3 3 次郎 6000
問題4:最新データを残す(中級)
📋 問題
以下のデータから、各顧客の最新の購入データだけを残してください。
df = pd.DataFrame({
'顧客ID': [1, 2, 1, 3, 2, 1],
'日付': ['2024-01-01', '2024-01-02', '2024-01-05',
'2024-01-03', '2024-01-06', '2024-01-10'],
'購入額': [5000, 3000, 4500, 6000, 3500, 5500]
})
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import pandas as pd
df = pd.DataFrame({
'顧客ID': [1, 2, 1, 3, 2, 1],
'日付': ['2024-01-01', '2024-01-02', '2024-01-05',
'2024-01-03', '2024-01-06', '2024-01-10'],
'購入額': [5000, 3000, 4500, 6000, 3500, 5500]
})
print("元のデータ:")
print(df)
# 日付でソート
df_sorted = df.sort_values('日付')
# 最新を残す
df_latest = df_sorted.drop_duplicates(subset=['顧客ID'], keep='last')
print("\n最新データだけ残す:")
print(df_latest.sort_values('顧客ID'))
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
元のデータ: 顧客ID 日付 購入額 0 1 2024-01-01 5000 1 2 2024-01-02 3000 2 1 2024-01-05 4500 3 3 2024-01-03 6000 4 2 2024-01-06 3500 5 1 2024-01-10 5500 最新データだけ残す: 顧客ID 日付 購入額 5 1 2024-01-10 5500 4 2 2024-01-06 3500 3 3 2024-01-03 6000
問題5:総合演習(上級)
📋 問題
以下のデータについて:
1. 全ての重複を確認
2. 完全重複を削除
3. 顧客IDで重複を削除
4. 各処理での削除数を報告
df = pd.DataFrame({
'顧客ID': [1, 2, 3, 1, 2, 4, 1, 5],
'名前': ['太郎', '花子', '次郎', '太郎', '花子', '美咲', '太郎', '健太'],
'購入額': [5000, 3000, 4500, 5000, 3000, 6000, 4800, 5200]
})
※ 画面が小さい場合は、コードブロックを横にスクロールできます
解答例を見る
コード
import pandas as pd
df = pd.DataFrame({
'顧客ID': [1, 2, 3, 1, 2, 4, 1, 5],
'名前': ['太郎', '花子', '次郎', '太郎', '花子', '美咲', '太郎', '健太'],
'購入額': [5000, 3000, 4500, 5000, 3000, 6000, 4800, 5200]
})
print("="*50)
print("重複データ分析レポート")
print("="*50)
print("\n【元のデータ】")
print(df)
print(f"総行数: {len(df)}行")
# 1. 全ての重複を確認
print("\n【1. 重複チェック】")
full_dup = df.duplicated()
print(f"完全重複: {full_dup.sum()}行")
id_dup = df.duplicated(subset=['顧客ID'])
print(f"顧客ID重複: {id_dup.sum()}行")
# 2. 完全重複を削除
df_no_full_dup = df.drop_duplicates()
print(f"\n【2. 完全重複削除後】")
print(df_no_full_dup)
print(f"残り: {len(df_no_full_dup)}行(削除: {len(df) - len(df_no_full_dup)}行)")
# 3. 顧客IDで重複を削除
df_no_id_dup = df.drop_duplicates(subset=['顧客ID'])
print(f"\n【3. 顧客ID重複削除後】")
print(df_no_id_dup)
print(f"残り: {len(df_no_id_dup)}行(削除: {len(df) - len(df_no_id_dup)}行)")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
================================================== 重複データ分析レポート ================================================== 【元のデータ】 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 2 3 次郎 4500 3 1 太郎 5000 4 2 花子 3000 5 4 美咲 6000 6 1 太郎 4800 7 5 健太 5200 総行数: 8行 【1. 重複チェック】 完全重複: 2行 顧客ID重複: 3行 【2. 完全重複削除後】 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 2 3 次郎 4500 5 4 美咲 6000 6 1 太郎 4800 7 5 健太 5200 残り: 6行(削除: 2行) 【3. 顧客ID重複削除後】 顧客ID 名前 購入額 0 1 太郎 5000 1 2 花子 3000 2 3 次郎 4500 5 4 美咲 6000 7 5 健太 5200 残り: 5行(削除: 3行)
🎯 このステップのまとめ
✅ 学んだこと
✓ duplicated()で重複を確認できる
✓ drop_duplicates()で重複を削除できる
✓ subsetで特定の列だけで重複を判定できる
✓ keepパラメータで残す行を選べる
✓ 重複データの分析ができる
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ duplicated()で重複を確認できる
□ drop_duplicates()で重複を削除できる
□ 特定列での重複判定ができる
□ 最新データを残す処理ができる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: duplicated()とdrop_duplicates()の違いは?
A: duplicated()は重複を確認する(True/Falseを返す)
drop_duplicates()は重複を削除する(新しいDataFrameを返す)
確認してから削除するのがおすすめです。
Q2: keep=’first’とkeep=’last’の使い分けは?
A: first:最初のデータを残す(登録日が古い方など)
last:最後のデータを残す(最新の情報など)
データの性質に応じて選びます。
Q3: 重複を削除すると元のデータも変わりますか?
A: いいえ、元のDataFrameは変更されません。
drop_duplicates()は新しいDataFrameを返します。
元を変更したい場合は、inplace=Trueを指定します。
Q4: 大文字小文字を区別せずに重複を削除したいです
A: 事前にdf['列名'].str.lower()で小文字に統一してから重複削除します。
または、重複判定用の列を追加する方法もあります。
Q5: 削除された行を保存しておきたいです
A: 削除前に重複行を抽出して保存しましょう:
removed = df[df.duplicated()]
これで削除される行を別に保存できます。
学習メモ
Pythonデータ分析入門 - Step 32