Как найти дубликаты в Pandas DataFrame(с примерами)
Вы можете использовать функцию Duplicated () для поиска повторяющихся значений в кадре данных pandas.
Эта функция использует следующий базовый синтаксис:
#find duplicate rows across all columns duplicateRows = df[df.duplicated ()] #find duplicate rows across specific columns duplicateRows = df[df.duplicated(['col1', 'col2'])]
В следующих примерах показано, как использовать эту функцию на практике со следующими пандами DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame print(df) team points assists 0 A 10 5 1 A 10 5 2 A 12 7 3 A 12 9 4 B 15 12 5 B 17 9 6 B 20 6 7 B 20 6
Пример 1. Поиск повторяющихся строк во всех столбцах
В следующем коде показано, как найти повторяющиеся строки во всех столбцах DataFrame:
#identify duplicate rows duplicateRows = df[df.duplicated ()] #view duplicate rows duplicateRows team points assists 1 A 10 5 7 B 20 6
Есть две строки, которые являются точными копиями других строк в DataFrame.
Обратите внимание, что мы также можем использовать аргумент keep=’last’ для отображения первых повторяющихся строк вместо последних:
#identify duplicate rows duplicateRows = df[df.duplicated (keep='last')] #view duplicate rows print(duplicateRows) team points assists 0 A 10 5 6 B 20 6
Пример 2. Поиск повторяющихся строк в определенных столбцах
В следующем коде показано, как найти повторяющиеся строки только в столбцах «команда» и «точки» в DataFrame:
#identify duplicate rows across 'team' and 'points' columns duplicateRows = df[df.duplicated(['team', 'points'])] #view duplicate rows print(duplicateRows) team points assists 1 A 10 5 3 A 12 9 7 B 20 6
Есть три строки, в которых значения столбцов «команда» и «очки» являются точными копиями предыдущих строк.
Пример 3. Поиск повторяющихся строк в одном столбце
В следующем коде показано, как найти повторяющиеся строки только в столбце «команда» DataFrame:
#identify duplicate rows in 'team' column duplicateRows = df[df.duplicated(['team'])] #view duplicate rows print(duplicateRows) team points assists 1 A 10 5 2 A 12 7 3 A 12 9 5 B 17 9 6 B 20 6 7 B 20 6
Всего имеется шесть строк, в которых значения в столбце «команда» являются точными копиями предыдущих строк.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:
Как подсчитать дубликаты в Pandas (с примерами)
Вы можете использовать следующие методы для подсчета дубликатов в pandas DataFrame:
Метод 1: подсчет повторяющихся значений в одном столбце
len(df['my_column'])- len(df['my_column']. drop_duplicates ())
Способ 2: подсчет повторяющихся строк
len(df)- len(df.drop_duplicates ())
Способ 3: подсчет дубликатов для каждой уникальной строки
df.groupby (df.columns.tolist (), as_index= False ). size ()
В следующих примерах показано, как использовать каждый метод на практике со следующими пандами DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame print(df) team position points 0 A G 5 1 A G 5 2 A G 8 3 A F 10 4 B G 5 5 B G 7 6 B F 10 7 B F 10
Пример 1. Подсчет повторяющихся значений в одном столбце
В следующем коде показано, как подсчитать количество повторяющихся значений в столбце точек :
#count duplicate values in points column len(df['points'])- len(df['points']. drop_duplicates ()) 4
Мы видим, что в столбце точек есть 4 повторяющихся значения.
Пример 2: подсчет повторяющихся строк
Следующий код показывает, как подсчитать количество повторяющихся строк в DataFrame:
#count number of duplicate rows len(df)- len(df.drop_duplicates ()) 2
Мы видим, что в DataFrame есть 2 повторяющиеся строки.
Мы можем использовать следующий синтаксис для просмотра этих двух повторяющихся строк:
#display duplicated rows df[df.duplicated ()] team position points 1 A G 5 7 B F 10
Пример 3. Подсчет дубликатов для каждой уникальной строки
В следующем коде показано, как подсчитать количество дубликатов для каждой уникальной строки в DataFrame:
#display number of duplicates for each unique row df.groupby (df.columns.tolist (), as_index= False ). size () team position points size 0 A F 10 1 1 A G 5 2 2 A G 8 1 3 B F 10 2 4 B G 5 1 5 B G 7 1
В столбце размера отображается количество дубликатов для каждой уникальной строки.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:
Как найти дубликаты в векторе датафрейм?
Датафрейм состоит из векторов ‘cleanUrl’ и ‘code_url’ Где ‘cleanUrl’ ссылка, а ‘code_url’ ссылка преобразованная в число с помощью:
from sklearn import preprocessing le = preprocessing.LabelEncoder()
Пример файла:
cleanUrl,code_url amerikan-gruzovik.ru,4590 tinatube.net,74861 sextelevizor.net,66791 ru.anysex.com,62743 www.asiamobil.ru,86865 www.chinamobil.ru,90045 ad-k.ru,2637 www.nik-store.ru,105112 video-seks.net,80108 russkoe-porno.info,63946 www.foxporns.com,94819 www.chrono24.com.ru,90117 www.wibes.ru,118283 german242.com,26297 santdom.ru,65100 treningchess.com,76231 razvedem.web-3.ru,60517 aktis-stroy.ru,3525 www.aktis-stroy.ru,85600 plot.name,56170 www.lichnycabinet.ru,100979 www.worldfishing.narod.ru,118532 sekretka.su,66123 www.a-centre.ru,85011 www.suzukirus.ru,113986 pornogl.com,57123 wmid234ru.ru,83678 hsi.ru,29794 infometer.ru,31244 www.git77.rostrud.ru,95784 www.packagetrackr.com,106632 www.tns-global.ru,115139 www.vipgroup.net,117281 www.toysrus.com,115433 moskva.wisell.ru,46046 www.shopjustice.com,111904 deti75.ru,16625 crimeacity.info,15195 baza.crimea.ua,8838 atelica-oazis.bron.me,6647 gokurort.ru,26990 mitula17.imhonet.ru,44811 foxbrest.imhonet.ru,24645 xavi.imhonet.ru,120090 ural.kp.ru,78539 spb.kp.ru,69996 pinkmarie.com,55650 geneva2015.cars.ru,26188 domodedovo.rujazi.com,18057 xn------5cdjccgu2avckptly3ad8p.xn--e1arcbfn.xn--p1ai,120241 baikalpress.ru,8328 klimovsk.mnogonado.net,35750 svet-modern.ru,72656 www.forex-kf.ru,94627 www.uniq-ip.com,116401 www.terrawoman.ua,114714 www.gorsovet.mk.ua,96192 vmr.gov.ua,81250 helpstu.su,28874 www.helpstu.su,96823 zab-nanny.ru,122892 kursak-diplom.com.ua,37838 kgu-journalist.ucoz.ru,34771 mospf.ru,46093 newdiplom.ucoz.ru,49231 www.autoezda.com,87258 referats.nashisrael.ru,60990 www.hotdiplom.ru,97129 fotorakom.com,24577 redirect.disqus.com,60900 www.sq.com.ua,113207 member.newsnet.in.ua,43580 bankomet.com.ua,8537 po4emu.ru,56252 www.po4emu.ru,107650 tric.info,76258 myotpusk.com,47714 yspehx.narod.ru,122777 vozhatiki.ru,81885 kirent.narod.ru,35483 www.festivalsearcher.com,94080 hotasianz.com.6716069.yupiromo.ru,29549 starblag.ucoz.ua,70955 www.medalbum.ru,102495 ab28ru.narod.ru,2336 diel.ks.ua,16931 aniplay.tv,5091 ugolzreniya.narod.ru,77854 vrn.vestipk.ru,81990 afg-hist.ucoz.ru,3023 www.shanson-plus.ru,111700 www.vsmolenske.ru,117854 vsetutonline.com,82254 stomatologmova.ucoz.ua,71506 xn----8sbgjprccxgonf4d1dya7b.xn--p1ai,120742 yarcube.ru,122335 www.pion.com.ru,107364 76yar.ru,1961 loveplanet-online.ru,40510
Нужно вернуть записи ‘code_url’, которые совпали с записями ‘cleanUrl’ в формате датафрейм. в полной версии файла 130 тыс. записей. Пробовал вложенным циклом, но процесс встал, очень долго. :
d=[] for a in range(len(df_label_url)): for b in range(len(df_label_url)): if df_label_url['code_url'][a]==df_label_url['cleanUrl'][b]: d.append(df_label_url['code_url'][a])
Предположительно так только в формате датафрейме:
[4590, 4590, 4590, 4590, 4590, 4590, 4590, 4590, 4590, 4590, 74861, 74861, 74861, 74861, 74861, 74861, 74861, 74861, 74861, 74861, 66791, 66791, 66791, 66791, 66791, 66791, 66791, 66791, 66791, 66791, 62743, 62743, 62743, 62743, 62743, 62743, 62743, 62743, 62743, 62743, 86865, 86865, 86865, 86865, 86865, 86865, 86865, 86865, 86865, 86865, 90045, 90045, 90045, 90045, 90045, 90045, 90045, 90045, 90045, 90045, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 105112, 105112, 105112, 105112, 105112, 105112, 105112, 105112, 105112, 105112, 80108, 80108, 80108, 80108, 80108, 80108, 80108, 80108, 80108, 80108, 63946, 63946, 63946, 63946, 63946, 63946, 63946, 63946, 63946, 63946]
Python: поиск и удаление дубликатов используя pandas
Рассмотрим поиск и удаление дубликатов в следующем наборе данных:
brand style rating 0 Yum Yum cup 4.0 1 Yum Yum cup 4.0 2 Yum Yum cup 4.0 3 Indomie cup 3.5 4 Indomie pack 15.0 5 Indomie pack 5.0
Преобразуем данную структуру данных в датафрейм используюя библиотеку pandas.
import pandas as pd df = pd.DataFrame(< 'brand': ['Yum Yum', 'Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'], 'style': ['cup', 'cup', 'cup', 'cup', 'pack', 'pack'], 'rating': [4, 4, 4, 3.5, 15, 5] >)
Поиск дубликатов в датафрейме
В pandas есть встроенная функция duplicated() для поиска дубликатов в датафрейме.
Вариант «по-умолчанию» предполагает, что поиск дубликатов будет осуществлен построчно, где для каждой строки будут проверяться совпадения во всех ее колонках. На выходе вы получите срез датафрейма, где для каждого индекса будет проставлен в формате bool признак о найденном совпадении:
> df.duplicated() # out 0 False 1 True 2 True 3 False 4 False 5 False dtype: bool
Как видите, каждая следующая запись, определенная как дубликат, помечается флагом True . Но бывают задачи, в которых требуется считать последнюю найденную запись как «оригинал», а все совпадения которые были до нее считать как «дубликат».
Передача доп. параметра keep=’last’ дает возможность не считать дубликатом только последнюю найденную запись:
> df.duplicated(keep='last') # out 0 True 1 True 2 False 3 False 4 False 5 False dtype: bool
А передача доп. параметра keep=False дает возможность отметить дубликатами все записи имеющие совпадения.
> df.duplicated(keep=False) #out 0 True 1 True 2 True 3 False 4 False 5 False dtype: bool
Также есть возможность делать проверку на дубликаты при совпадении значений не во всех колонках, а только в определенных, указав их явно при помощи параметра subset . Причем, данный параметр можно указывать совместно с keep .
> df.duplicated(subset=['brand','style']) #out 0 False 1 True 2 True 3 False 4 False 5 True dtype: bool
Как отфильтровать данные без учета дубликатов
Для этого нужно применить стандартный механизм фильтрации данных в датафрейме на основе его признаков. В данном случае признак у нас один — это флаг наличия дубликата в соответствии с индексом наших данных, т.е. то выражение которое мы разбирали выше. Его мы и передадим в датайрейм, поставив перед ним знак ~ , что означает отфильтровать все записи, которые не являются True (т.е не являются дубликатами). Если же не указать ~ , то отфильтруется наоборот — т.е. останутся только дубликаты.
# короткий формат записи df[~df.duplicated(subset=['brand','style'])] # тоже самое, но более подробно через промежуточную переменную dpl, где ~ заменяется на явное указание False dpl = df.duplicated(subset=['brand','style']) df[dpl == False]
Как удалить дубликаты
Дубликаты удаляются точно так же, как осуществляется их поиск, который мы разобрали выше, но вместо функции поиска дубликатов df.duplicated() используется функция их удаления df.drop_duplicates() . Также обратите внимание, при удалении вы точно также как и при поиске можете указывать все те же параметры: keep и subset для уточнения критериев определения дубликатов.
> df.drop_() #out brand style rating 0 Yum Yum cup 4.0 3 Indomie cup 3.5 4 Indomie pack 15.0 5 Indomie pack 5.0