6
respostas

Problema com iteração

Boa noite, Estou tendo dificultades com um código relacionado à for in. Trata-se de uma serie de um DataFrame com diversos endereços:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Eu preciso excluir a parte final de cada uma das linhas a partir de LATITUDE, ou seja, constar apenas os endereços de fato. Para isso, eu notei um padrão relacionado ao travessão, de forma que trabalhei pra excluir tudo o que consta após o 4° travessão, ficando apenas o endereço. Nesse ponto até obtive sucesso. Entretanto, o resultado do código não está sendo como eu espero, uma vez que está se repetindo sempre a primeira linha em todas as linhas. Segue código que escrevi para tal.

index=0
lista=[]
lista2=[]

for linha in df:
     for letra in linha:
        if (letra == '-'):
            index = index + 1
        if (index<=3):
            lista.append(letra)
            s =''.join(lista)
    lista2.append(s)       

lista2

Espero ter sido claro, há alguma forma mais eficiente de resolver o problema? por que o código está repetindo a mesma linha em toda a série?

6 respostas

Boa noite, Daniel!

O DataFrame é um objeto constituído por séries (colunas) rotuladas, desta forma, ao iterar diretamente um DataFrame ele retornará apenas os rótulos da coluna. Como neste caso precisamos iterar apenas na coluna 'Endereço', uma solução seria:

index=0
lista=[]
lista2=[]

for linha in df['Endereço']:
     for letra in linha:
        if (letra == '-'):
            index = index + 1
        if (index<=3):
            lista.append(letra)
            s =''.join(lista)
    lista2.append(s)       

lista2

Na documentação do pandas existe uma série de métodos de iteração identificados pelo começo iter, eles permitem percorrer os valores através de tuplas que retornam (index, valor) ou (nome da coluna, valor) . Contudo, essa solução deve ser utilizada com cautela, uma vez que se executada sobre datasets muito longos seria pouco eficiente (é considerada um antipadrão na biblioteca), sendo preferível usar soluções de vetorização (tais como expressões regulares).

Obrigado pela resposta Henrique, entretanto a variável 'df' já é uma serie, confesso que não usei o melhor nome. Eu é que usei o método pd.DataFrame pra ficar mais 'bonito', motivo pelo qual não consigo nem selecionar coluna, já que só existe uma.

Certo, Daniel! Sendo assim, acredito que o problema seja na declaração da variável index, como ela é declarada antes do primeiro laço ela sempre retornará um valor maior que 3, desde que já tenha passado da primeira linha. Acredito que se ela for declarada após o primeiro for o problema será resolvido, pois a cada nova linha a variável *index *voltará ao valor 0.

lista=[]
lista2=[]

for linha in df['Endereço']:
     index=0
     for letra in linha:
        if (letra == '-'):
            index = index + 1
        if (index<=3):
            lista.append(letra)
            s =''.join(lista)
    lista2.append(s)       

lista2

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

Ja foi um avanço, mas ele está juntando os endereços na mesma linha gradativamente.

Bom dia, Daniel!

O problema parece ser o mesmo que ocorreu com a variável index, porém agora com a variável lista. Pelo o que compreendi da lógica, esta lista é uma variável auxiliar, que serve apenas para identificar o que deve ser mantido a cada linha da série com os endereços. Como foi declarada fora do laço nunca será reiniciada, assim, a cada iteração ela capta o novo endereço mantendo o endereço da linha anterior. Ou seja, a solução é reiniciar a variável a cada iteração do laço mais externo:

lista2=[]

for linha in df:
     lista=[]
     index=0
     for letra in linha:
        if (letra == '-'):
            index = index + 1
        if (index<=3):
            lista.append(letra)
            s =''.join(lista)
    lista2.append(s)       

lista2

Assim a variável index funciona como um contador de eventos (ocorrência do caractere -) e a variável lista como um auxiliar.

Perfeito! funcionou. Muito obrigado!