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

[Dúvida] Problema com a filtragem pelo método query

Bom dia gente !!

Estou avançando nos estudos de python para data science e passando a conhecer mais a biblioteca Pandas. Para me exercitar nisto resolvi tentar eu mesmo pegar algum banco de dados e fazer minha própria leitura.

Vou expor aqui o passo a passo do que fiz até chegar no meu problema

  • Fiz a leitura do arquivo csv associando-o a uma variável
df_crimes_violentos_2018_2023 = pd.read_csv('D:\IAGO RODRIGUES\Documents\Dados segurança pública\MG\Banco Crimes Violentos - 2018-2023.csv', sep= ';', encoding= 'ANSI')
  • Verifiquei os valores únicos presentes em determinada coluna
df_crimes_violentos_2018_2023['Natureza'].unique()
array(['Estupro Consumado', 'Estupro de Vulnerável Consumado',
       'Estupro de Vulnerável Tentado', 'Estupro Tentado',
       'Extorsão Consumado', 'Extorsão Mediante Sequestro Consumado',
       'Extorsão Tentado', 'Homicídio Tentado', 'Roubo Consumado',
       'Roubo Tentado', 'Sequestro e Cárcere Privado Consumado',
       'Sequestro e Cárcere Privado Tentado',
       'Homicídio Consumado (Registros)'], dtype=object)
  • Criei uma variável determinando quais os tipos de informações presentes nessa coluna me interessariam
cr_patr_viol = ['Extorsão Consumado','Extorsão Tentado','Extorsão Mediante Sequestro Consumado','Roubo Consumado','Roubo Tentado']

Foi desse momento pra frente que passei a ter problemas. Resolvi usar o método query para realizar a filtragem dos dados, associando o query a variável criada. Fiz da seguinte forma e obtive o seguinte erro

df_crimes_violentos_2018_2023.query("Natureza" in @cr_patr_viol")
Cell In[22],   line 1
    df_crimes_violentos_2018_2023.query("Natureza" in @cr_patr_viol")
                                                                   ^
SyntaxError: unterminated string literal (detected at line 1)

Eu não entendi a ideia por trás do erro de sintaxe apontado

Tentei usar outras formulas para evitar isso, tendo inclusive especificado na própria query a lista dos crimes contidos na variável e o problema se repetiu

A única forma que deu certo foi mais custosa, sendo que eu usei o operador 'or' resultando em uma linha de código muito extensa e pouco prática na minha opinião. Foi a seguinte

df_crimes_violentos_2018_2023.query("Natureza == 'Extorsão Consumado' or Natureza == 'Extorsão Tentado' or Natureza == 'Extorsão Mediante Sequestro Consumado' or Natureza == 'Roubo Consumado' or Natureza == 'Roubo Tentado'")

Vocês poderiam me fornecer algum insight sobre isto

2 respostas
solução!

Olá Iago, tudo bem?

Acho que pode estar dando erro devido as aspas estarem posicionadas de forma errada. Tenta corrigir da seguinte forma:

df_crimes_violentos_2018_2023.query("Natureza in @cr_patr_viol")

Você pode fazer o filtro desta forma também, que irá funcionar:


df_crimes_violentos_2018_2023[df_crimes_violentos_2018_2023["Natureza"].isin(cr_patr_viol)]

O método "isin()" do pandas faz essa função de verificar os registros presentes na lista.

Espero que tenha ajudado.

Abraço!

Vinícius, você conseguiu me ajudar no problema, muito obrigado!! Realmente foi as aspas que foram mal empregadas. Eu estava empregando o nome da coluna como se fosse uma 'string' e isso parece que gerou o erro!! Mais uma vez, muito obrigado pela ajuda!!