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
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.