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

Erro df

Tenho um df com uma coluna com algumas informações sobre pofissionais, como a seguir:

profissionais['DS_SITUACAO_FUNCIONAL'].unique()
array(["['ELETRICISTA']", "['ELETRONICO']",
       "['PINTOR']", "['EXPERIENTE']", "['ADULTO']",
       "['MARCENEIRO']", "['PROFISSIONAL']"], dtype=object)

O comando a seguir retorna o erro abaixo

profissionais = profissionais.query("DS_SITUACAO_FUNCIONAL=='['PINTOR']", "['EXPERIENTE']", "['ADULTO']")

ValueError: For argument "inplace" expected type bool, received type str.
8 respostas

Boa noite, No caso o erro foi gerado pela virgula, se voce quer selecionar as linhas em que a coluna 'DS_SITUACAO_FUNCIONAL' = PINTOR vai usar o seguinte comando:

profissionais = profissionais.query('DS_SITUACAO_FUNCIONAL==PINTOR')
print(profissionais)

ou

profissionais.query('DS_SITUACAO_FUNCIONAL==PINTOR',inplace=True)
print(profissionais)

e para selecionar somente as colunas experiente e adulto:

profissionais = profissionais[['EXPERIENTE','ADULTO']]
print(profissionais)

Bom dia, ocorre que os caracteres "colchetes" e "apóstrofos" fazem parte de cada "célula" (e eu quero manter assim). Por exemplo:

DS_SITUACAO_FUNCIONAL
['PINTOR'], ['ELETRICISTA']
['MARCENEIRO']
['ELETRICISTA'], ['ELETRONICO']
['LIMPEZA']

Grato.

boa tarde, para gerar esse filtro seria necessário usar:

profissionais = profissionais.loc[(profissionais['DS_SITUACAO_FUNCIONAL'] == ['EXPERIENTE'] )| (profissionais['DS_SITUACAO_FUNCIONAL'] ==['ADULTO']) | (profissionais['DS_SITUACAO_FUNCIONAL'] == ['PINTOR'])]
print(profissionais)

1) O comando sugerido gera o seguinte erro:

    ValueError: ('Lengths must match to compare', (2093,), (1,))

3) O loc deve ser usado quando o termo pesquisado for um índice do tipo object, correto? Nâo é o caso aqui!

4) Além disso, conforme informado anteriormente, algumas células contêm valores do tipo:

['PINTOR'], ['ELETRICISTA']

Ou seja, esses dois valores acima estão na mesma célula e não em células distintas. Agradeço mais uma vez e no aguardo de alguma outra dica.

Boa tarde, Sem o DataFrame original esta dificil de fazer a analise.

Tente dessa maneira:

filtro = profissionais['DS_SITUACAO_FUNCIONAL'].isin(["['EXPERIENTE']","['ADULTO']","['PINTOR']"])
teste = profissionais[filtro]
print(teste)

Perdão, segue o df

import pandas as pd

profissionais = {'DS_SITUACAO_FUNCIONAL': ["['ELETRICISTA], ['ELETRONICO']", "['PINTOR'], ['EXPERIENTE'], ['ADULTO']",
       "['MARCENEIRO'], ['PROFISSIONAL']"]
}

profissionais = pd.DataFrame(profissionais)
profissionais

Fiz um teste e, mesmo assim, não funciona como esperado, porque, segundo a documentação oficial, só vai retornar TRUE se a "célula" inteira corresponder aos termos ['PINTOR'], ['EXPERIENTE'], ['ADULTO']. Eu preciso que retorne, se o termo contiver quaisquer um como a seguir, cumulativo ou não: ['PINTOR'] ou ['EXPERIENTE'] ou ['ADULTO'].

Ex:

 1) ['PINTOR'], ['EXPERIENTE'], ['ADULTO'], 
 2) ['PINTOR'], ['EXPERIENTE']
 3) ['PINTOR']
 4) ['EXPERIENTE']
 5) ['ADULTO'], ['EXPERIENTE'], ['PINTOR']
 6) ETC...

Acho que seria mais adequado o uso do CONTAINS ou equivalente, certo? Entretanto, não consegui adaptar o contains para esse caso.

solução!

Bom dia, sim o contains vai te trazer o resultado esperado:

filtro = profissionais.DS_SITUACAO_FUNCIONAL.str.contains('EXPERIENTE')
filtro2 = profissionais.DS_SITUACAO_FUNCIONAL.str.contains('ADULTO')
filtro3 = profissionais.DS_SITUACAO_FUNCIONAL.str.contains('PINTOR')

print(profissionais[filtro])
print(profissionais[filtro2])
print(profissionais[filtro3])

Perfeito. Obrigado, João.