Проверьте наличие повторяющихся значений в столбце dataframe


Есть ли способ проверить, имеет ли столбец фрейма данных повторяющиеся значения без удаления строк? У меня есть функция, которая удаляет дубликаты строк, однако я хочу, чтобы она выполнялась только в том случае, если в определенном столбце действительно есть дубликаты.

В настоящее время я сравниваю количество уникальных значений в столбце с количеством строк: если уникальных значений меньше, чем строк, то есть дубликаты и код выполняется.

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

Есть ли более простой или эффективный способ проверить, если повторяющиеся значения существуют в определенном столбце, используя панды?

Некоторые примеры данных, с которыми я работаю (показаны только два столбца). Если дубликаты найдены, то другая функция определяет, какую строку сохранить (строка с самой старой датой):

    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
1 5

1 ответ:

Вот полный пример:

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)

Возвращает

True

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

Очень часто в pandas я бы сказал, что мы заинтересованы в создании булевых масок, то есть массивов True или False, которые мы можем использовать для выбора подмножества фрейма. В этом случае мы могли бы, например, захотеть создать:
m = ~df['Student'].duplicated(keep='first')
# array([ True,  True,  True, False,  True, False])

~m равно np.инвертировать(m), который переворачивает True в False и наоборот. Очень полезно получить в этом случае none-дубликаты. Если мы теперь передадим это в фрейм данных в качестве селектора:

df[m]

Мы получить еще раз:

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

Прежде, однако, я удосужился изменить столбец даты на datetime. Это хорошая практика перед выполнением любого типа сортировки даты или любой операции с датой.