Видаліть всі повторювані рядки в Python Pandas


160

Ця 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.

Відповіді:


235

Це набагато простіше в пандах зараз з 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
Що робити, якщо мої стовпці не позначені явно? Як я вибираю стовпці лише на основі їх індексу?
Хамман Самуель

2
Можливо df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
Бен

5
ви можете спробуватиdf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi

68

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

keep : {'first', 'last', False}, за замовчуванням 'first'

  • по-перше: викиньте дублікати, за винятком першого виникнення.

  • останнє: викиньте дублікати, окрім останнього.

  • Неправильно: викиньте всі дублікати.

Тож встановлення keepзначення False дасть бажану відповідь.

DataFrame.drop_duplicates (* args, ** kwargs) Повернення DataFrame з видаленими повторюваними рядками, необов'язково з урахуванням певних стовпців

Параметри: підмножина: мітка стовпця або послідовність міток, необов'язково Розглядайте лише певні стовпці для ідентифікації дублікатів, за замовчуванням використовуйте всі збереження стовпців: {'first', 'last', False}, за замовчуванням 'first' first: Drop duplicapts для першого виникнення. останнє: викиньте дублікати, окрім останнього. Неправильно: викиньте всі дублікати. take_last: застаріле місце: boolean, за замовчуванням False Чи потрібно відміняти дублікати на місці або повернути копії cols: аргумент лише аргументу підмножини [застаріло] Повертає: deduplicate: DataFrame


26

Якщо ви хочете, щоб результат зберігався в іншому наборі даних:

df.drop_duplicates(keep=False)

або

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

Якщо той самий набір даних потрібно оновити:

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

Вище наведені приклади будуть видаляти всі дублікати і зберігати один, подібний до DISTINCT *SQL


12

використання 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

Насправді потрібні лише рядки 0 та 1 (для збереження будь-яких спостережень, що містять відповідні А та С.):

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]

Але я підозрюю, що ви насправді хочете саме цього (зберігається одне спостереження, що містить відповідні А та С.):

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 у прикладних даних).
Джеймі Булл

0

Спробуйте ці різні речі

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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.