Удалить все повторяющиеся строки в Python панды


The pandasdrop_duplicates функция отлично подходит для" унификации " фрейма данных. Однако одним из ключевых аргументов для передачи является take_last=True или take_last=False, в то время как я хотел бы удалить все строки, которые являются дубликатами в подмножестве столбцов. Это возможно?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

в качестве примера, я хотел бы удалить строки, которые совпадают по столбцам A и C так что это должно отбросить строки 0 и 1.

5 64

5 ответов:

это гораздо проще в панд теперь с drop_duplicates и параметр keep.

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)

просто хочу добавить к ответу Бена на drop_duplicates:

keep: {'first',’ last', False}, по умолчанию 'first'

  • во-первых: удаление дубликатов, за исключением первого вхождения.

  • last: удаление дубликатов, за исключением последнего вхождения.

  • False: удалить все дубликаты.

поэтому ставим keep ложь мы даем вам нужные ответ.

таблицы данных.drop_duplicates (*args, **kwargs) возвращает фрейм данных с дубликаты строк удаляются, необязательно только с учетом определенных столбцов

параметры: подмножество: метка столбца или последовательность меток, необязательно По умолчанию следует учитывать только определенные столбцы для идентификации дубликатов используйте все столбцы keep: {‘first’, ‘last’, False}, default ’ first ' first: отбросьте дубликаты, за исключением первого вхождения. последний : Удаление дубликатов, за исключением для последнего случая. False: отбросить все дубликаты. take_last: deprecated inplace: boolean, default False Нужно ли удалять дубликаты на месте или возвращать копию cols : kwargs только аргумент subset [deprecated] возвращает: дедуплицированный : Таблицы данных

использовать groupby и filter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)

если вы хотите, чтобы результат был сохранен в другом наборе данных:

df.drop_duplicates(keep=False)

или

df.drop_duplicates(keep=False, inplace=False)

Если же набор данных нуждается в обновлении:

df.drop_duplicates(keep=False, inplace=True)

выше примеры удалят все дубликаты и сохранить один, похожий на DISTINCT * в SQL

на самом деле, drop строк 0 и 1 требуется только (любые наблюдения, содержащие совпадающие A и C сохраняется.):

In [335]:

df['AC']=df.A+df.C
In [336]:

print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
     A  B  C    AC
2  foo  1  B  fooB
3  bar  1  A  barA

[2 rows x 4 columns]

но я подозреваю, что вы действительно хотите этого (одно наблюдение, содержащее совпадающие A и C, сохраняется.):

In [337]:

print df.drop_duplicates('AC')
     A  B  C    AC
0  foo  0  A  fooA
2  foo  1  B  fooB
3  bar  1  A  barA

[3 rows x 4 columns]

Edit:

Теперь это гораздо яснее, таким образом:

In [352]:
DG=df.groupby(['A', 'C'])   
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]