Fonction df.drop_duplicates() 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 (si
inplace=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 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 :
- Dans les données d'origine, la ligne 0 et la ligne 2 sont exactement identiques (Zhang San, 25 ans, département Technologie).
- Les lignes 1 et 4 sont également exactement les mêmes (Li Si, 30 ans, service Marketing).
- Utilisation
drop_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 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 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 utilisant
keep='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 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 ; car
keep=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 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 utiliser
ignore_index, après suppression de la ligne 2, l'index est 0, 1, 3, ce qui n'est pas contigu. - Utilisation
ignore_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 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 :
- Les données d'origine comportent 6 lignes, avec 2 commandes en double (O001 et O002 apparaissent chacune deux fois).
- Utiliser
drop_duplicates(subset=['订单号'])Dédupliquer en fonction du numéro de commande. - 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.- Utiliser
subsetLors 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. - Utiliser
keep=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.
Autres extensions