Step 32:重複データの処理

🔍 ステップ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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE