Pandas — проверка на наличие дубликатов

#python #pandas #duplicates

#python #pandas #дубликаты

Вопрос:

У меня есть набор данных, в котором я хочу реализовать три уровня проверок

а) если все значения в Col B являются дубликатами, тогда print(«все дубликаты»)
б) если последние 8 значений в Col B являются дубликатами, тогда print («последние 8 дубликатов»)
в) если последние 5 значений в Col B являются дубликатами, тогда print («последние 5 дубликатов»)

Фрейм данных:

         Col A  Col B
    0    XYZ    452
    1    ZXP    452
    2    ABZ    452
    3    CDP    452
    4    XEF    452
    5    ZRT    452
    6    XXX    452
    7    YYY    452
    8    DDD    452
    9    EEE    452
   10    FFF    452
   11    ZZA    452
 

Сначала я пробовал случай со всеми дубликатами:

 if df.['Col B'].duplicated.all():
    print("all dupes")

elif df.['Col B'].tail(8).duplicated.all():
    print("last 8 dupes")

elif df.['Col B'].tail(5).duplicated.all():
    print("last 5 dupes")

else:
    print("no dupes")
 

но это сразу переходит к «без дубликатов».

Ответ №1:

Я думаю, вам нужно изменить, удалив . и добавив () Series.duplicated() , если нужно проверить все дубликаты, добавьте keep=False параметр:

 df.['Col B'].duplicated.all()
 

Для:

 df['Col B'].duplicated(keep=False).all()
 

Все вместе:

 if df['Col B'].duplicated(keep=False).all():
    print("all dupes")

elif df['Col B'].tail(8).duplicated(keep=False).all():
    print("last 8 dupes")

elif df['Col B'].tail(5).duplicated(keep=False).all():
    print("last 5 dupes")

else:
    print("no dupes")
 

Вы можете протестировать столбец только один раз, а затем выбрать последние значения маски m :

 m = df['Col B'].duplicated(keep=False)

if m.all():
    print("all dupes")

elif m.tail(8).all():
    print("last 8 dupes")

elif m.tail(5).all():
    print("last 5 dupes")

else:
    print("no dupes")
 

Комментарии:

1. Спасибо, израэль, я совершенно неверно истолковал объяснение параметра keep=False в документации, очень признателен.

Ответ №2:

Вы можете сделать:

 import numpy as np

if len(np.unique(df['Col B']))==1:
    print("All dupes")
elif len(np.unique(df['Col B'].tail(8)))==1:
    print("last 8 dupes")
elif len(np.unique(df['Col B'].tail(5)))==1:
    print("last 5 dupes")
else:
    print("no dupes")
 

Комментарии:

1. спасибо, не подумал о подходе np 🙂

Ответ №3:

Обратите внимание, что дублированный метод DataFrame может принимать метку столбца, поэтому вы можете использовать его следующим образом:

 import pandas as pd
df = pd.DataFrame({'A':['XYZ','ZXP','ABZ'],'B':[452,452,452]})
print(df.duplicated('B', keep=False).all())
 

Вывод:

 True
 

Комментарии:

1. в вашем ответе была часть параметра keep = False, также в соответствии с ответом Израэля выше, спасибо за ваше время 🙂