Fonction df.drop_duplicates() de Pandas

Fonctions courantes de Pandas


df.drop_duplicates()C'est une fonction de Pandas utilisée pour supprimer les lignes dupliquées.

Lors de la collecte et de l'intégration des données, les données dupliquées sont un problème courant.drop_duplicates()Elle peut vous aider à identifier et à supprimer les lignes dupliquées en fonction des colonnes désignées ou de toutes les colonnes, en conservant la première ou la dernière occurrence. C'est très utile pour la déduplication des données et pour garantir l'unicité des données.


Syntaxe de base et paramètres

drop_duplicates()C'est une fonction membre de DataFrame, appelée via l'opérateur point.pour l'invoquer.

Format de syntaxe

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)

Description du paramètre

Paramètre Type Requis Description Valeur par défaut
sous-ensemble étiquette de colonne ou liste Optional Spécifiez la ou les colonnes utilisées pour déterminer les doublons. Si c'estNone, toutes les colonnes sont utilisées. Il peut s'agir d'un seul nom de colonne ou d'une liste de noms de colonnes. Aucune
keep str ou False Optional Spécifiez quel enregistrement en double conserver.'first'Conserver le premier ;'last'Conserver le dernier ;FalseSupprimer tous les enregistrements en double. 'first'
inplace bool Optional S'il estTrue, modifie directement le DataFrame d'origine et ne renvoie pas de nouvel objet ; s'il estFalse, renvoie un nouveau DataFrame, et les données d'origine restent inchangées. False
ignore_index bool Optional S'il estTrue, réinitialise l'index du résultat, en repartant de 0 ; s'il estFalse, conserve l'index d'origine. False

Description de la valeur de retour

  • Renvoie un nouveau DataFrame (siinplace=False), ouNone(siinplace=True)。
  • Le DataFrame renvoyé ne contient pas de lignes dupliquées.

Exemples

Maîtrisons en profondeur, à travers une série d'exemples,drop_duplicates()l'utilisation.

Exemple 1 : Supprimer les lignes entièrement dupliquées

Par défaut, toutes les colonnes sont utilisées pour déterminer si une ligne est un doublon.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant des lignes en double
data = {
    'Nom': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu', 'Li Si'],
    'Age': [25, 30, 25, 35, 30],
    'Département': ['Technologie', 'Marketing', 'Technologie', 'Technologie', 'Marketing']
}
df = pd.DataFrame(data)

print(Données originales :)
print(df)
print("=" * 50)

# Supprimer les lignes en double, conserver la première occurrence
df_cleaned = df.drop_duplicates()

print(Données après suppression des lignes en double :)
print(df_cleaned)

Sortie attendue :

原始数据:
    姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
2  张三   25  技术
3  王五   35  技术
4  李四   30  市场
==================================================
删除重复行后的数据:
    0  姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
3  王五   35  技术

Explication du code :

  1. Dans les données d'origine, la ligne 0 et la ligne 2 sont exactement identiques (Zhang San, 25 ans, département Technologie).
  2. Les lignes 1 et 4 sont également exactement les mêmes (Li Si, 30 ans, service Marketing).
  3. Utilisationdrop_duplicates()avec les paramètres par défaut, les lignes dupliquées sont supprimées et la première occurrence est conservée.

Exemple 2 : Supprimer les lignes en double en fonction de colonnes spécifiées

Vous pouvez utilisersubsetparamètre pour déterminer les doublons en se basant uniquement sur des colonnes spécifiques.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame
data = {
    'Nom': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu'],
    'Age': [25, 30, 28, 35],  # Zhang San apparaît deux fois, mais avec des âges différents
    'Département': ['Technologie', 'Marketing', 'Technologie', 'Marketing']
}
df = pd.DataFrame(data)

print(Données originales :)
print(df)
print("=" * 50)

# Déterminer les doublons en se basant uniquement sur la colonne "Name"
df_cleaned = df.drop_duplicates(subset=['Name'])

print(Données après suppression des doublons en fonction de la colonne Name :)
print(df_cleaned)
print("=" * 50)

# Déterminer les doublons en se basant sur les colonnes "Name" et "Department"
df_cleaned2 = df.drop_duplicates(subset=['Name', 'Department'])

print(Données après suppression des doublons en fonction des colonnes Name et Department :)
print(df_cleaned2)

Sortie attendue :

原始数据:
    姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
2  张三   28  技术  # 虽然姓名重复,但年龄不同
3  王五   35  市场
==================================================
根据姓名列删除重复后的数据:
    姓名  年龄  部门
0  张三   25  技术  # 保留第一条张三的记录
2  张三   28  技术
3  王五   35  市场
==================================================
根据姓名和部门列删除重复后的数据:
     参数
姓名  年龄  部门
0  张三   25  技术
1  李四   30  市场
3  王五   35  市场

Explication du code :

  • Lors de la détermination des doublons en fonction de la colonne Name, les lignes 0 et 2 ont toutes deux le nom « Zhang San » et sont considérées comme des lignes dupliquées, donc seule la ligne 0 est conservée.
  • Lors de la détermination des doublons en fonction des colonnes Name et Department, les lignes 0 et 2 ont les mêmes valeurs pour Name et Department, donc la ligne 0 est conservée.

Exemple 3 : Conserver le dernier enregistrement dupliqué

Utilisationkeep='last'le paramètre conserve le dernier enregistrement dupliqué rencontré.

Exemple

import pandas as pd
import numpy as np

# Créer un DataFrame contenant des lignes en double
data = {
    'Student ID': ['S001', 'S002', 'S001', 'S003', 'S002'],
    'Nom': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu', 'Li Si'],
    'Score': [85, 90, 88, 92, 85]  # Le même Student ID peut avoir des scores différents
}
df = pd.DataFrame(data)

print(Données originales :)
print(df)
print("=" * 50)

# Conserver le premier enregistrement (par défaut)
df_first = df.drop_duplicates(subset=['Student ID'], keep='first')

print(Conservation du premier enregistrement en double :)
print(df_first)
print("=" * 50)

# Conserver le dernier enregistrement
df_last = df.drop_duplicates(subset=['Student ID'], keep='last')

print(Conservation du dernier enregistrement en double :)
print(df_last)

Sortie attendue :

原始数据:
    学号  姓名  成绩
0  S001  张三     85
1  S002  李四     90
2  S001  张三     88  # 同一个人,成绩不同
3  S王五   92
4  S002  李四     85  # 同一个人,成绩不同
==================================================
保留第一条重复记录:
    学号  姓名  成绩
0  S001 张三     85  # 保留第一个85分
1  S002  李四     90  # 保留第一个90分
3  王五   92
==================================================
保留最后一条重复记录:
    学号  姓名  成绩
2  S001  张三     88  # 保留最后一个88分
3  王五   92
4  S002  李四     85  # 保留最后一个85分

Explication du code :

  • Student ID S001 a deux enregistrements avec des scores 85 et 88 ; en utilisantkeep='first'conserve celui avec le score 85,keep='last'conserve celui avec le score 88.
  • Student ID S002 a également deux enregistrements, avec des scores 90 et 85.
  • Choisissez s'il faut conserver le premier ou le dernier enregistrement selon les besoins métier.
  • Exemple 4 : Supprimer tous les enregistrements en double

    Utilisationkeep=Falsesupprime tous les enregistrements en double, en ne conservant que les lignes qui sont complètement uniques.

    Exemple

    import pandas as pd
    import numpy as np

    # Créer un DataFrame
    data = {
        'A': [1, 1, 2, 2, 3],
        'B': [1, 1, 2, 2, 3],
        'C': [1, 2, 3, 3, 5]
    }
    df = pd.DataFrame(data)

    print(Données originales :)
    print(df)
    print("=" * 50)

    # Supprimer toutes les lignes en double (ne conserver aucun doublon)
    df_cleaned = df.drop_duplicates(keep=False)

    print(Données après suppression de toutes les lignes en double :)
    print(df_cleaned)

    Sortie attendue :

    原始数据:
       A  B  C
    0  1  1  1
    1  1  1  2  # 与第0行A和B相同,是重复行
    2  2  2  3
    3  2  2  3  # 与第2行完全相同,是重复行
    4  3  3  5
    ==================================================
    删除所有重复行后的数据:
       A  B  C
    4  3  3  5
    

    Explication du code :

    • Les lignes 0 et 1 ont les mêmes valeurs dans les colonnes A et B, ce qui en fait des lignes en double ; carkeep=Falseelles sont toutes les deux supprimées.
    • Les lignes 2 et 3 sont aussi complètement dupliquées et sont toutes les deux supprimées.
    • Seule la ligne 4 est complètement unique et est conservée.

    Exemple 5 : Réinitialiser l'index

    Après la suppression des lignes en double, l'index d'origine peut devenir non contigu ; vous pouvez utiliserignore_index=Truepour réinitialiser l'index.

    Exemple

    import pandas as pd
    import numpy as np

    # Créer un DataFrame contenant des lignes en double
    data = {
        'Nom': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu'],
        'City': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou']
    }
    df = pd.DataFrame(data)

    print(Données originales :)
    print(df)
    print("=" * 50)

    # Supprimer les lignes en double sans réinitialiser l'index
    df_cleaned1 = df.drop_duplicates()

    print(Supprimer les lignes en double (conserver l'index d'origine) :)
    print(df_cleaned1)
    print("=" * 50)

    # Supprimer les lignes en double et réinitialiser l'index
    df_cleaned2 = df.drop_duplicates(ignore_index=True)

    print(Supprimer les lignes en double (réinitialiser l'index) :)
    print(df_cleaned2)

    Sortie attendue :

    原始数据:
        姓名  城市
    0  张三  北京
    1  李四  上海
    2  张三  北京
    3  王五  广州
    ==================================================
    删除重复行(保留原始索引):
        姓名  城市
    0  张三  北京
    1  李四  上海
    3  王五  广州
    ==================================================
    删除重复行(重置索引):
        姓名  城市
    0  张三  北京
    1  李四  上海
    2  王五  广州
    

    Explication du code :

    • Sans utiliserignore_index, après suppression de la ligne 2, l'index est 0, 1, 3, ce qui n'est pas contigu.
    • Utilisationignore_index=True, l'index redémarre à 0, ce qui donne 0, 1, 2.

    Exemple 6 : Combiner avec d'autres opérations

    drop_duplicates()Il peut être utilisé en combinaison avec d'autres opérations DataFrame.

    Exemple

    import pandas as pd
    import numpy as np

    # Simuler des données récupérées à partir d'une requête de base de données
    data = {
        'ID de commande': ['O001', 'O002', 'O001', 'O003', 'O002', 'O004'],
        'Nom du client': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu', 'Li Si', 'Zhao Liu'],
        'Montant': [100, 200, 100, 300, 200, 400],
        'Date': ['2024-01-01', '2024-01-02', '2024-01-01', '2024-01-03', '2024-01-02', '2024-01-04']
    }
    df = pd.DataFrame(data)

    print("Données de commande originales :")
    print(df)
    print("=" * 50)

    # Vérifier le nombre de commandes en double
    print(f"Nombre total de lignes : {len(df)}")
    print(f"Lignes après déduplication : {len(df.drop_duplicates())}")
    print(f"Lignes en double : {len(df) - len(df.drop_duplicates())}")
    print("=" * 50)

    # Dédupliquer réellement, conserver le premier enregistrement et ne conserver que les colonnes nécessaires
    df_unique = df.drop_duplicates(subset=['Order ID'])[['Order ID', 'Customer Name', 'Amount']]

    print("Données de commande dédupliquées :")
    print(df_unique)

    Sortie attendue :

    原始订单数据:
        订单号  客户名  金额   日期
    0  O001    张三  100  2024-01-01
    1  O002    李四  200  2024-01-02
    2  O001    张三  100  2024-01-01  # 重复订单
    3  O003    王五  300  2024-01-03
    4  O002    李四  200  2024-01-02  # 重复订单
    5  O004    赵六  400  2024-01-04
    ================================================++
    总行数: 6
    去重后行数: 4
    重复行数: 2
    

    Explication du code :

    1. Les données d'origine comportent 6 lignes, avec 2 commandes en double (O001 et O002 apparaissent chacune deux fois).
    2. Utiliserdrop_duplicates(subset=['订单号'])Dédupliquer en fonction du numéro de commande.
    3. Combiné avec la sélection de colonnes[['Order Number', 'Customer Name', 'Amount']], ne conserver que les colonnes nécessaires.

    Précautions

    • drop_duplicates()Par défaut, le DataFrame d'origine n'est pas modifié ; si vous souhaitez le modifier sur place, utilisezinplace=Trueparamètre.
    • UtilisersubsetLors de l'utilisation du paramètre, les doublons sont déterminés uniquement par les colonnes spécifiées ; les valeurs des autres colonnes n'affectent pas la détermination.
    • Utiliserkeep=Falsesupprimera toutes les lignes en double, ce qui peut entraîner une perte importante de données ; à utiliser avec prudence.
    • Avant de supprimer les données en double, il est recommandé d'analyser d'abord la cause des doublons afin de garantir que l'opération de suppression est conforme à la logique métier.
    • Si des valeurs manquantes (NaN) sont présentes dans les données, elles seront considérées par défaut comme une même valeur lors de la comparaison.

    Fonctions courantes de Pandas

    Autres extensions