3
respostas

Identificar substring dentro de string. Não funcionou. Help?

Olá! Meu objetivo é criar um Tipo Agregado que conterá o texto 'Casa', se o campo 'Tipo' contiver qualquer tipo de casa. Caso contrário, atribuirá 'Apto' a Tipo Agregado.

Não está funcionando. Veja imagem do resultado.

No código abaixo, com str(), é atribuído Casa para todos.

for i in dados:
    if ('Casa' in str(dados['Tipo'])):
        dados['Tipo Agregado'] = 'Casa'
    else:
        dados['Tipo Agregado'] = 'Apto'

dados.head(50)

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeTentei também sem o str, e não funcionou. Ficou tudo como Apto. Veja abaixo. Porque? E o que é necessário fazer para funcionar?

for i in dados:
    if ('Casa' in dados['Tipo']):
        dados['Tipo Agregado'] = 'Casa'
    else:
        dados['Tipo Agregado'] = 'Apto'

dados.head(50)

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

3 respostas

Oi, Lyse! Tudo bom com você? Eu espero que sim!

Tem uma forma bem rápida de fazer o que você deseja que é utilizando a seleção que o professor ensinou no curso, mas desta vez, alterando um pouco o que fazermos com a Series. Vou montar aqui um exemplo que acredito que estará alinhado com o seu objetivo, mas se tiver algo diferente, você pode adaptar no seu código, tudo bem?

Primeiro foi criada uma lista com nomes do que podem casas na coluna Tipo e depois uma Series que contém os valores True e False, classificando se a linha da coluna Tipo tem (com True) ou não tem (com False) uma casa, essa Series foi nomeada de selecao e o código correspondente pode ser observado abaixo:

casas = ['Casa', 'Casa de Condomínio', 'Casa de Vila']
selecao = dados['Tipo'].isin(casas)
selecao.head()

A saída de selecao.head() é a seguinte:

0False
1True
2False
3False
4False

Com essa Series é possível substituir onde tem True por 'Casa' e onde tem False por 'Apto' com o método replace:

selecao.replace({True:'Casa',False:'Apto'},inplace=True)
selecao.head()

E a saída de selecao.head() é a seguinte

0Apto
1Casa
2Apto
3Apto
4Apto

Por fim, foi criada a coluna 'Tipo Agregado' no DataFrame dados com os valores de selecao:

dados['Tipo Agregado'] = selecao
dados.head()

Então, o DataFrame dados fica do seguinte modo:

TipoBairroQuartosVagasSuitesAreaValorCondominioIPTUTipo Agregado
0QuitineteCopacabana10040170050060Apto
1CasaJardim Botânico2011007000nannanCasa
2Conjunto Comercial/SalaBarra da Tijuca040150520040201111Apto
3ApartamentoCentro1001580039020Apto
4ApartamentoHigienópolis10048800230nanApto

Eu espero ter te ajudado! Se surgir outra dúvida estarei à disposição.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Mirla! Você é sempre muito atenciosa nas respostas! No entanto, eu realmente quero aprender outras formas. O Python tem diversas formas de se fazer a mesma coisa. Quando eu vejo algo que eu já vi de uma outra forma antes, tento replicar. O exemplo que o prof fez no vídeo, eu fiz também, sem problemas. Aí fiquei querendo aprender mais, outras formas. Então quero tentar usar o "in", como eu estava tentando, identificar substring dentro de string, como no exemplo: if ('Casa' in str(dados['Tipo']): e também usando o contains. Como seria, dessas duas formas? Eu venho tentando, sem sucesso.

Que interessante Lyse! Muito bom mesmo.

Então vou aproveitar o laço for que você já enviou aqui, tudo bem? Vamos ajustar ele aqui.

Na primeira linha, ao utilizar for i in dados: isso está fazendo i ler todos os dados de dados e ler eles. No entanto, não é mais trabalho o i dentro desse código. Já na condicional if ('Casa' in str(dados['Tipo'])) foi transformada toda a Series em string mas, quando é utilizado o in para esse caso, é verificado se existe 'Casa' em toda a Series dados['Tipo'] e isso sempre vai ser verdade pois nessa Series sempre vai existir a palavra Casa. Por fim, a agregação dados['Tipo Agregado'] = 'Casa' não é correta pois para criar uma coluna nova, é preciso ter um conjunto de dados adequado, como uma lista, array ou uma Series para criar uma nova coluna.

Então, para o código que desejamos, podemos criar primeiro uma lista qualquer vazia para receber os dados para a nova coluna 'Tipo Agregado'. Depois criamos um laço for que vai percorrer todas as linhas da coluna 'Tipo' de dados dessa coluna:

lista = []
for tipos in dados['Tipo']:

Podemos utilizar tipos como um comparador pois ele representa todos os elementos da coluna Tipo. Assim, de acordo com a presença ou não da palavra 'Casa' em tipos iremos adicionar 'Casa' ou 'Apto' na lista que será a nova coluna 'Tipo Agregado'.

    if ('Casa' in tipos):
        lista.append('Casa')
    else:
        lista.append('Apto')

Por fim, adicionamos lista à coluna 'Tipo Agregado':

dados['Tipo Agregado'] = lista
dados.head()

E o resultado obtido será o mesmo obtido na resposta passada ^^

Vou deixar aqui o código completo caso queria testar:

lista = []
for tipos in dados['Tipo']:
    if ('Casa' in tipos):
        lista.append('Casa')
    else:
        lista.append('Apto')

dados['Tipo Agregado'] = lista
dados.head(10)

Outra opção é fazer a leitura linha por linha dos elementos de 'Tipo' separadamente, através da iteração pelas linhas do DataFrame:

lista = []
for linha in range(dados.shape[0]):
    if ('Casa' in dados['Tipo'][linha]):
        lista.append('Casa')
    else:
        lista.append('Apto')

dados['Tipo Agregado'] = lista
dados.head(10)

Note que é utilizado dados.shape[0] para coletarmos a quantidade de linhas em dados e é lido linha por linha da coluna 'Tipos'.

Os dois exemplos fazem a mesma tarefa, mas eu vejo o primeiro com uma leitura mais clara, portanto eu prefiro ele, mas vai do que você gostar também! Já o uso de contains não é tão indicado aqui, é mais adequado utilizar o in mesmo.

Eu espero que agora tenha ficado mais adaptado ao que você deseja fazer ^^ Se surgir outra dúvida estarei à disposição.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!