web-dev-qa-db-fra.com

Vérifier les valeurs en double dans la colonne dataframe

Existe-t-il un moyen de vérifier si une colonne de structure de données contient des valeurs en double sans supprimer de lignes? J'ai une fonction qui supprimera les lignes en double, cependant, je ne veux qu'elle s'exécute que s'il y a des doublons dans une colonne spécifique.

Actuellement, je compare le nombre de valeurs uniques dans la colonne au nombre de lignes: s'il y a moins de valeurs uniques que de lignes, il y a des doublons et le code s'exécute.

 if len(df['Student'].unique()) < len(df.index):
    # Code to remove duplicates based on Date column runs

Existe-t-il un moyen plus simple ou plus efficace de vérifier si des valeurs en double existent dans une colonne spécifique, à l'aide de pandas?

Quelques exemples de données avec lesquels je travaille (uniquement deux colonnes). Si des doublons sont trouvés, une autre fonction identifie la ligne à conserver (celle avec la date la plus ancienne):

    Student Date
0   Joe     December 2017
1   James   January 2018
2   Bob     April 2018
3   Joe     December 2017
4   Jack    February 2018
5   Jack    March 2018
11
Jeff Mitchell

Voici un exemple complet:

import pandas as pd
import numpy as np

data = '''\
Student,Date
Joe,December 2017
James,January 2018
Bob,April 2018
Joe,December 2017
Jack,February 2018
Jack,March 2018'''

df = pd.read_csv(pd.compat.StringIO(data), sep=',')        # <--- Recreate dataframe

print(any(df['Student'].duplicated()))                     # <--- Prints True

df['Date'] = pd.to_datetime(df.Date)                       # <--- Do this to get datetime
df = df.sort_values(by='Date').drop_duplicates('Student')  # <--- Sort and drop
df['Date'] = df.Date.dt.strftime('%B %Y')                  # <--- Old date format

print(df)

Résultats

True

  Student           Date
0     Joe  December 2017
1   James   January 2018
4    Jack  February 2018
2     Bob     April 2018

Très souvent dans pandas, je dirais que nous sommes intéressés par la création de masques booléens, c'est-à-dire des tableaux de True ou de False que nous pouvons utiliser pour sélectionner un sous-ensemble du cadre. Dans ce cas, nous pourrions par exemple vouloir créer:

m = ~df['Student'].duplicated(keep='first')
# array([ True,  True,  True, False,  True, False])

~ m est égal à np.invert (m) qui inverse True à False et vice versa. Très utile pour obtenir les non-doublons dans ce cas. Si nous passons maintenant cela au dataframe en tant que sélecteur:

df[m]

Nous avons encore une fois:

  Student           Date
0     Joe  December 2017
1   James   January 2018
2     Bob     April 2018
4    Jack  February 2018

Avant, cependant, je me suis donné la peine de changer la colonne Date en date/heure. C'est une bonne pratique avant de faire n'importe quel type de tri ou d'opération sur les dates.

12
Anton vBR