Подтвердить что ты не робот

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

Функция pandas drop_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.

4b9b3361

Ответ 1

Это намного проще в pandas теперь с 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)

Ответ 2

используйте 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)

Ответ 3

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

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

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

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

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

Итак, установите keep в False, мы дадим вам желаемый ответ.

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

Параметры: подмножество: метка столбца или последовательность меток, необязательная Учитывайте только определенные столбцы для идентификации дубликатов, по умолчанию используйте все столбцы: {'first,' last, False}, default 'First first: Drop дубликаты, за исключением первого вхождения. последний: Удалить дубликаты, за исключением последнего вхождения. False: сбросить все дубликаты. take_last: устаревший inplace: boolean, default False Отбрасывать ли дубликаты на место или возвращать копии cols: kwargs только аргумент подмножества [устаревший] Возвраты: дедуплицированный: DataFrame

Ответ 4

Собственно, отбрасывать строки 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]

Изменить:

Теперь это намного яснее, поэтому:

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]