Solte todas as linhas duplicadas no Python Pandas


159

A pandas drop_duplicatesfunção é ótima para "unificar" um quadro de dados. No entanto, um dos argumentos de palavra-chave a ser aprovado é take_last=Trueou take_last=False, enquanto eu gostaria de eliminar todas as linhas duplicadas em um subconjunto de colunas. Isso é possível?

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

Como exemplo, eu gostaria de soltar linhas que correspondam às colunas Ae, Cportanto, isso deve soltar as linhas 0 e 1.

Respostas:


233

Isso é muito mais fácil nos pandas agora com drop_duplicates e o parâmetro 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
E se minhas colunas não forem explicitamente rotuladas? Como seleciono as colunas apenas com base em seu índice?
Hamman Samuel

2
Talvez df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
Ben

5
você poderia tentardf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi

67

Só quero adicionar a resposta de Ben em drop_duplicates :

keep : {'primeiro', 'último', Falso}, padrão 'primeiro'

  • primeiro: elimine duplicatas, exceto a primeira ocorrência.

  • last: elimina duplicatas, exceto a última ocorrência.

  • Falso: elimine todas as duplicatas.

Portanto, definir keepFalso fornecerá a resposta desejada.

DataFrame.drop_duplicates (* args, ** kwargs) Retorna o DataFrame com linhas duplicadas removidas, opcionalmente considerando apenas determinadas colunas

Parâmetros: subconjunto: rótulo da coluna ou sequência de rótulos, opcional Considere apenas determinadas colunas para identificar duplicatas; por padrão, use todas as colunas mantidas: {'first', 'last', False}, padrão 'first' first: Eliminar duplicatas, exceto para a primeira ocorrência. last: elimina duplicatas, exceto a última ocorrência. Falso: elimine todas as duplicatas. take_last: descontinuado no local: booleano, padrão Falso Se deixar cair duplicatas no local ou retornar uma cópia cols: kwargs apenas argumento do subconjunto [descontinuado] Retorna: deduplicado: DataFrame


25

Se você deseja que o resultado seja armazenado em outro conjunto de dados:

df.drop_duplicates(keep=False)

ou

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

Se o mesmo conjunto de dados precisar ser atualizado:

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

Os exemplos acima removerão todas as duplicatas e manterão uma, semelhante à DISTINCT *do SQL


11

usar groupbyefilter

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)

4

Na verdade, as linhas 0 e 1 descartadas requerem apenas (são mantidas quaisquer observações que contenham A e C correspondentes.):

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]

Mas eu suspeito que o que você realmente quer é isso (uma observação contendo A e C correspondentes é mantida.):

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]

Editar:

Agora é muito mais claro, portanto:

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
Se era isso que eu queria, eu usaria df.drop_duplicates(['A','C'])como padrão para manter uma observação, a primeira ou a última, como mencionei na pergunta - embora eu tenha acabado de perceber que a palavra-chave estava errada enquanto escrevia de memória. O que eu quero é eliminar todas as linhas que são idênticas nas colunas de interesse (A e C nos dados de exemplo).
Jamie Touro

-1

Experimente estas várias coisas

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')

ou

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

ou

>>>df.drop_duplicates( keep='last')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.