Olá, Tereza, tudo bem?
Quando você usa df = df.query('Tipo == "Apartamento"'), o método query() cria um novo DataFrame apenas com as linhas que atendem ao filtro. Esse novo objeto é então atribuído novamente à variável df. Na prática, o Python está atualizando a referência da variável df para apontar para esse novo DataFrame. O anterior só permanece na memória caso ainda exista outra variável apontando para ele; caso contrário, será descartado pelo coletor de lixo.
Agora, sobre a diferença entre sobrescrever e criar uma nova variável, podemos pensar assim:
- Sobrescrever o DataFrame
 Utilizamos quando não precisamos mais dos dados originais e queremos economizar memória. Porém, perdemos a possibilidade de voltar ao DataFrame completo. Também ajuda a manter o código mais enxuto e organizado, já que evita a criação de várias variáveis intermediárias.
 
- Criar uma nova variável
 Mantém os dados originais intactos, o que é interessante em análises exploratórias, já que podemos aplicar diferentes filtros e comparar resultados. Por exemplo:
 - df_apartamentos = df.query('Tipo == "Apartamento"')
 - Assim, - dfcontinua com todos os registros, e- df_apartamentoscontém apenas os filtrados.
 
Portanto, sobrescrever é mais econômico, mas menos flexível; criar uma nova variável dá mais segurança e liberdade durante a análise.
Espero ter esclarecido sua dúvida.
Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!