Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Tratar valores repetidos adicionando sufixo no PANDAS

Pessoal, vocês poderiam me ajudar?

Tenho um DataFrame com 1836vlinhas X 13 colunas e uma das minhas colunas (Description) deve ser a junção de duas anteriores (descripción_del_punto + estación_) até aí eu consegui chegar, só que essa coluna só pode ter valores únicos.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como vocês podem ver no print acima, nos últimos registros eu tenho várias repetições, e isso acontece ao longo do df, eu consegui identificar quais itens se repetem, mas não consegui encontrar uma maneira de adicionar um sufixo a eles, para que deixem de ser repetidos, por exemplo: CEN_Reservas 1, CEN_Reservas 2, ..., CEN_Reservas 10

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeVocês poderiam me ajudar a tratar essa coluna?

3 respostas

Pessoal, atualizando, consegui adicionar o sufixo usando groupby e cumcount, mas não estou conseguindo remover as casas decimais...

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Olá, Victor! Tudo bom?

Bastante interessante o modo como utilizou o groupby com o cumcount, eu refatorei um pouco do código por aqui e cheguei em um resultado que satisfaz o pedido.

Antes de começarmos, uma dica importante na hora de postar o código por aqui no Fórum é postar utilizando o bloco de código e também disponibilizar alguma amostra dos dados. No artigo Fórum da Alura são motradas algumas dicas de como usar melhor nosso Fórum.

Utilizando a sua metodologia cheguei nesse resultado:

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':[10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
                   'col2':['a','a','b','c','c','b','d','d','d','d']})

df['teste'] = df['col2'] + ["_"]*len(df['col2']) + (df.groupby('col2').cumcount() + 1).astype(str)
df

Saída:

col1col2teste
010aa_1
120aa_2
230bb_1
340cc_1
450cc_2
560bb_2
670dd_1
780dd_2
890dd_3
9100dd_4

Mas enquanto verificava essa questão, também desenvolvi um procedimento usando Numpy, Pandas e Python.



Criando o DataFrame

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':[10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
                   'col2':['a','a','b','c','c','b','d','d','d','d']})
df

Saída:

col1col2
010a
120a
230b
340c
450c
560b
670d
780d
890d
9100d

Criando um DataFrame auxiliar

Esse DataFrame foi criado como uma cópia ordenada do primeiro DataFrame, onde nós vamos ordenar pela coluna de interesse, nesse caso, a col2.

df2 = df.sort_values(by='col2')

Criando a lista de contagem

A partir desse momento, eu uso o DataFrame auxiliar para criar uma lista que usa a quantidade de ocorrências dos valores na coluna para numerar cada ocorrência.

reference = df['col2'].value_counts(ascending=True)
reference

Saída:

a    2
b    2
c    2
d    4
Name: col2, dtype: int64

E como agora temos a frequência de cada valor, podemos criar uma lista que vai de 1 até a quantidade de cada elemento.

value_reference = []

for i in reference:
    value_reference += list(range(1, i + 1))

value_reference
>>> [1, 2, 1, 2, 1, 2, 1, 2, 3, 4]

E nesse momento, nós podemos adicionar algum caractere entre os termos, um espaço ou sublinhado (_).

value_reference = [" " + str(x) for x in value_reference]
value_reference
>>> [' 1', ' 2', ' 1', ' 2', ' 1', ' 2', ' 1', ' 2', ' 3', ' 4']

Concatenando com Numpy

A partir desse moento, nós podemos usar o método to_list() do Pandas para transformar uma coluna em uma lista, e concatenar com a nossa lista value_reference utilizando uma função do Numpy que concatena strings termo a termo, no caso, a np.char.add(lista1, lista2). Da seguinte maneira:

df2['new_col'] = np.char.add(df2['col2'].to_list(), value_reference)
df2
col1col2new_col
010aa 1
120aa 2
230bb 1
560bb 2
340cc 1
450cc 2
670dd 1
780dd 2
890dd 3
9100dd 4

Nesse momento nós podemos voltar a configuração original resetando o nosso índice.

df2.sort_index()
col1col2new_col
010aa 1
120aa 2
230bb 1
340cc 1
450cc 2
560bb 2
670dd 1
780dd 2
890dd 3
9100dd 4

Resumo da Ópera

Existem várias maneiras de fazer a mesma coisa utilizando as bibliotecas ou Python puro. Algumas vezes serão necessárias a reescrita do código manualmente para evitar a dependência de bibliotecas externas, mas conhecer as possibilidades de cada ferramenta é essencial para evitar reinventar a roda quando não necessário.

Show!!! Muito Obrigado, funcionou das duas maneiras por aqui. Mantive a solução com groupby() e cumcount() apenas por questão de preferir o código mais enxuto para essa solução