Удалите все повторяющиеся строки из нескольких столбцов в Панд Python

#python #python-3.x #pandas #dataframe

Вопрос:

Эта pandas drop_duplicates функция отлично подходит для «унификации» фрейма данных. Однако одним из аргументов ключевого слова для передачи является take_last=True or 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.

Ответ №1:

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

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

1. Что делать, если мои столбцы явно не помечены? Как мне выбрать столбцы только на основе их индекса?

2. Может df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index) быть ?

3. вы могли бы попробовать df.drop_duplicates(subset=[df.columns[0:2]], keep = False)

4. Если у вас subset только один столбец , как A , то keep=False будут удалены все строки. Если вы определяете keep как first или last , вы сохраните по крайней мере одну запись из всех. Это не относится к вопросу, но если ваше подмножество состоит из одного столбца (как в моем случае), эта информация может быть полезна при работе с drop_duplicates методом: вы можете потерять много записей, вместо того, чтобы просто удалять дубликаты. С уважением :).

Ответ №2:

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

keep : {‘первый’, ‘последний’, False}, по умолчанию » первый’

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

Таким образом, установка keep значения False даст вам желаемый ответ.

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

Параметры: подмножество : метка столбца или последовательность меток, необязательно учитывать только определенные столбцы для идентификации дубликатов, по умолчанию используйте все столбцы, сохраняйте: {«первый», «последний», False}, по умолчанию «первый» сначала : Отбросьте дубликаты, за исключением первого вхождения. последнее : Отбросьте дубликаты, за исключением последнего вхождения. Ложь : Удалите все дубликаты. take_last : устарело на месте : логическое значение, по умолчанию Ложно, следует ли удалять дубликаты на месте или возвращать копию cols : только аргумент kwargs подмножества [устарело] Возвращает: дедуплицировано : Фрейм данных

Ответ №3:

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

 df.drop_duplicates(keep=False)
 

или

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

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

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

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

Ответ №4:

использовать 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)
 

Ответ №5:

Попробуйте эти различные вещи

 df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')
 

или

 >>>df.drop_duplicates( keep='first')
 

или

 >>>df.drop_duplicates( keep='last')
 

Ответ №6:

На самом деле для удаления строк 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]
 

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

1. Если бы это было то, что я хотел, я бы просто использовал df.drop_duplicates(['A','C']) по умолчанию одно наблюдение, первое или последнее, как я упоминал в вопросе, хотя я только что понял, что ошибся с ключевым словом, когда писал по памяти. Что я хочу, так это удалить все строки, которые идентичны в интересующих столбцах (A и C в данных примера).