
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
- Détermine les doublons à marquer :
- 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.
