Skip to content

pandas : Trouver et supprimer les lignes dupliquées de DataFrame, Series

Utilisez duplicated() et drop_duplicates() pour rechercher, extraire, compter et supprimer les lignes en double de pandas.DataFrame, pandas.Series.

Cet article décrit le contenu suivant.

  • Rechercher les lignes en double :duplicated()
    • Détermine les doublons à marquer :keep
    • Spécifiez la colonne à rechercher en double :subset
    • Compter les lignes dupliquées/non dupliquées
  • Supprimez les lignes en double :drop_duplicates()
  • Agrégation basée sur les éléments en double :groupby()

Les données suivantes sont utilisées à titre d’exemple. la ligne #6 est un doublon de la ligne #3.

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

df = df.append({'name': 'Dave', 'age': 68, 'state': 'TX', 'point': 70}, ignore_index=True)
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57
# 6     Dave   68    TX     70

L’exemple de fichier CSV est lié ci-dessous.

pandas.DataFrame est utilisé dans l’exemple de code suivant, mais presque de la même manière peut être appliqué à pandas.Series.

Rechercher les lignes en double :duplicated()

La méthode duplicated () renvoie boolean pandas.Series avec des lignes en double comme True. Par défaut, toutes les colonnes sont utilisées pour déterminer si une ligne est un doublon ou non.

print(df.duplicated())
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

Vous pouvez utiliser ce pandas.Series pour extraire les lignes en double du pandas.DataFrame d’origine.

print(df[df.duplicated()])
#    name  age state  point
# 6  Dave   68    TX     70

Détermine les doublons à marquer :keep

La valeur par défaut de l’argument keep est ‘first’, et la première ligne dupliquée est déterminée comme étant False comme dans l’exemple ci-dessus.

Si vous définissez keep=’last’, la dernière ligne dupliquée est déterminée comme étant False.

print(df.duplicated(keep='last'))
# 0    False
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# 6    False
# dtype: bool

Avec keep = False, toutes les lignes en double sont déterminées comme étant True.

print(df.duplicated(keep=False))
# 0    False
# 1    False
# 2    False
# 3     True
# 4    False
# 5    False
# 6     True
# dtype: bool

Spécifiez la colonne à rechercher en double :subset

Comme mentionné ci-dessus, par défaut, toutes les colonnes sont utilisées pour identifier les doublons.

Vous pouvez spécifier la colonne à utiliser pour identifier les doublons dans le sous-ensemble d’arguments.

print(df.duplicated(subset='state'))
# 0    False
# 1    False
# 2     True
# 3    False
# 4     True
# 5     True
# 6     True
# dtype: bool

Il est également possible de spécifier plusieurs colonnes avec une liste.

print(df.duplicated(subset=['state', 'point']))
# 0    False
# 1    False
# 2    False
# 3    False
# 4    False
# 5    False
# 6     True
# dtype: bool

Compter les lignes dupliquées/non dupliquées

Vous pouvez compter le nombre de lignes en double en comptant True dans pandas.Series obtenu avec duplicated(). Le nombre de True peut être compté avec la méthode sum().

print(df.duplicated().sum())
# 1

Si vous voulez compter le nombre de False (= le nombre de lignes non dupliquées), vous pouvez l’inverser avec la négation ~ puis compter True avec sum().

print(~df.duplicated())
# 0     True
# 1     True
# 2     True
# 3     True
# 4     True
# 5     True
# 6    False
# dtype: bool

print((~df.duplicated()).sum())
# 6

Vous pouvez également compter True et False avec value_counts().

print(df.duplicated().value_counts())
# False    6
# True     1
# dtype: int64

Notez que le résultat dépend de l’argument keep. Utilisez correctement selon votre objectif.

print(df.duplicated(keep=False).value_counts())
# False    5
# True     2
# dtype: int64

Supprimez les lignes en double :drop_duplicates()

Vous pouvez utiliser duplicated() et l’opérateur de négation ~ pour supprimer les lignes en double.

print(df[~df.duplicated()])
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Vous pouvez également supprimer les lignes en double avec drop_duplicates().

print(df.drop_duplicates())
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

garder, sous-ensemble

Les arguments keep et subset peuvent être définis pour drop_duplicates() ainsi que duplicated().

print(df.drop_duplicates(keep=False))
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df.drop_duplicates(subset='state'))
#     name  age state  point
# 0  Alice   24    NY     64
# 1    Bob   42    CA     92
# 3   Dave   68    TX     70

en place

Par défaut, un nouveau DataFrame avec les lignes en double supprimées est renvoyé. Avec l’argument inplace = True, les lignes en double sont supprimées du DataFrame d’origine.

df.drop_duplicates(subset='state', keep='last', inplace=True)
print(df)
#     name  age state  point
# 4  Ellen   24    CA     88
# 5  Frank   30    NY     57
# 6   Dave   68    TX     70

Agrégation basée sur les éléments en double :groupby()

Utilisez groupby() pour agréger les valeurs en fonction des éléments en double.

Dans l’exemple suivant, la moyenne des valeurs des colonnes numériques age et point est calculée pour chaque élément en double dans la colonne d’état.

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df.groupby('state').mean())
#         age      point
# state                 
# CA     28.0  83.333333
# NY     27.0  60.500000
# TX     68.0  70.000000

Il est également possible de concaténer des chaînes et de les convertir en listes.

print(df.groupby('state').agg(
    {'name': lambda x: ','.join(x),
     'age': 'mean',
     'point': 'mean'}))
#                     name  age      point
# state                                   
# CA     Bob,Charlie,Ellen   28  83.333333
# NY           Alice,Frank   27  60.500000
# TX                  Dave   68  70.000000

print(df.groupby('state').agg(
    {'name': list,
     'age': 'mean',
     'point': 'mean'}))
#                         name  age      point
# state                                       
# CA     [Bob, Charlie, Ellen]   28  83.333333
# NY            [Alice, Frank]   27  60.500000
# TX                    [Dave]   68  70.000000

La méthode de chaîne join() est appliquée pour concaténer des chaînes dans une expression lambda.

La fonction intégrée list() est appliquée pour convertir en liste.