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

Atribuir Mediana para cada Tipo de imóvel

Olá pessoal, Localizei vários registros que estão NaN na coluna de Condomínio. No exercicio do curso é instruindo a realizar alguns tratamentos. Porém gostaria de ir além, para cada Tipo diferente de imóvel, gostaria de calcular a mediana desse grupo e atribuir ao dados faltantes esse resultado.

Ou seja, calcular a mediana do condominio dos registros de Apartamento e atribuir aos Tipos Apartamentos com Condominio NaN esse valor. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Consegui realizar isso de forma individual, ou seja, localizando a mediana de Apartamento e substituindo. Logo após a mediana de Casa e atribuindo aos valores nulos. Gostaria de saber se possui um jeito mais rapido e simples de realizar esse condicional e essas substituições.

3 respostas

Olá, Luis! Tudo bem com você?

Para fazer isso de forma automática podemos utilizar o método fillna. O fillna vai preencher seus dados faltantes de acordo com cada o valor da coluna em que o dado faltante está inserido. Para preencher da forma que você quer uma ideia é fazer da seguinte forma:

df2 = df.fillna(df.median())
df2.head()

Dessa forma você preenche cada uma das colunas numéricas com sua respectiva coluna.

É possível utilizar esse método também com o groupby, conforme a documentação.

Qualquer dúvida estou à disposição.

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

Sim Bruno, essa maneira o instrutor passou durante o curso. Porém ela irá preencher com a mediana do grupo inteiro, sem levar em consideração o Tipo do Imóvel. O que gostaria de realizar é atribuir a mediana do Valor somente do grupo de Apartamentos a todos e somente aos registros NaN de Apartamentos. E realizar isso para os outros tipos de imóveis. Ou seja, calcular a mediana de Casas e atribuir esse valor aos dados faltantes dos registros de Casas. Não sei se consegui explicar direito. Obrigado pela ajuda!

solução!

Olá, Luis! Tudo bem com você?

Peço desculpas pela interpretação errada da sua dúvida.

Para fazer o que você está querendo primeiro temos que calcular a mediana para todos os tipos. Podemos fazer isso da seguinte forma:

medianas = dados.groupby('Tipo').agg({'Condominio': 'median'})
medianas

Saída:

TipoCondominio
Apartamento976
Box/Garagem345
Casa816.5
Casa Comercial750
Casa de Condomínio1100
Casa de Vila80
Chácaranan
Conjunto Comercial/Sala1106.5
Flat1800
Galpão/Depósito/Armazém4879
Hotelnan
Indústrianan
Loft664
Loja Shopping/ Ct Comercial1243
Loja/Salão1170
Loteamento/Condomínionan
Pousada/Chalé295
Prédio Inteiro13460
Quitinete420
Studio549
Sítionan
Terreno Padrão1

Dessa forma você calculou as medianas para cada tipo. Percebe-se que alguns valores são nan, isso acontece porque todas as amostras desse tipo de imóvel tem condominio igual a nan, portanto não há como calcular a mediana.

Agora que temos as medianas de cada tipo, vamos preencher os dados faltantes utilizando os métodos .fillna e .apply da seguinte forma:

dados_preenchidos = dados.apply(lambda x: x.fillna(medianas.loc[x['Tipo'], 'Condominio']), axis = 1)
dados_preenchidos

O que esse de código está fazendo a preenchendo os dados faltantes, através do método fillna com os valores de mediana de cada tipo, calculada anteriormente.

Conferindo novamente a base de dados:

dados_preenchidos.isnull().sum()

Saída:

Tipo           0
Bairro         0
Quartos        0
Vagas          0
Suites         0
Area           0
Valor          0
Condominio    19
IPTU           9
dtype: int64

Percebemos que alguns valores ainda estão ausentes em Condominio, que são justamente aqueles tipos onde todos os valores eram nan no conjunto de dados original. Para comprovar isso, execute o código abaixo:

lista = dados_preenchidos[dados_preenchidos['Condominio'].isna()].Tipo.unique()
for i in lista:
    display(df_agg.get_group(i))

Qualquer dúvida estou à disposição.

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