Проверьте наличие повторяющихся значений в столбце 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 ответ:
Вот полный пример:
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. Это хорошая практика перед выполнением любого типа сортировки даты или любой операции с датой.