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

Funcao retorna erro

Tenho um df com uma coluna onde, diversas celulas possuem valores repetidos, separados por virgula, como a seguir:

Nome
Jose, Jose, Jose, Jose, Maria

Eu quero eliminar os repetidos, de forma que o resultado fique como a seguir:

Nome
Jose, Maria

A função abaixo faz isso:

def verifica_repetido(nomes): 
    l_nomes = nomes.split(",")
    for i in l_nomes:
       set_aux = set(l_nomes)
       resultado = list(set_aux)
       return resultado

funcionario['Nome'] = funcionario['Nome'].apply(verifica_repetido)

O problema é que ela so executa uma vez. Ao tentar executar novamente, ela dá o erro: AttributeError: 'list' object has no attribute 'split' Por que, claro, ela ja retornou a lista quando foi usado o split() na primeira vez. Como resolvo isso? Trata-se de uma aplicação onde a função precisa ser chamada mais de uma vez.

2 respostas

Olá Rogerio, tudo bem?

Creio que posso dar uma sugestão :

Tem uma forma no Python que duplica uma lista: " [:] " É usada para duplicar uma lista usar ela pra algum tratamento do seu programa sem comprometer a lista original, já que listas são, mutaveis ou seja ela pode ser modificada com facilidade ao contrario de uma tupla.

Para realizar uma cópia: listaoriginal = [1,2,3] listacopia = listaoriginal[:]

Tente printar lista copia, e vera q tem uma copia para tratar com sua função que usa "set" e elimina os repetidos sem perder os valores da sua lista original. :)

Se ajudou é só dar um joia

solução!

Obrigado, mas tentei e não rolou. Como o erro ocorre, especificamente, no trecho l_nomes = listacopia.split(",") na segunda vez em que a função é chamada, fiquei pensando se não seria mais util uma condicional. Ou seja, se não for uma lista, ele não "splitar" e retornar o valor como está. Caso contrário, ele "splitar" e entrar no "for". Daí, fuçando mais um pouco, cheguei à seguinte conclusão e vou deixar aqui caso alguém precise da mesma solução:

def verifica_repetido(nomes): 
  if type(nomes)!=list:
    l_nomes = nomes.split(",")
    for i in l_nomes:
       set_aux = set(l_nomes)
       resultado = list(set_aux)
       return resultado
  else:
    return nomes

Ou seja, bastou eu adicionar um "if' para verificar se já é uma lista ou não. Se não for, ele splita; se for, ele pula direto pro return já com a lista pronta. Grato.