Como podemos usar uma função para modificar valores dentro do Pandas?
No vídeo 5 da série Programar não é escrever código, é resolver problemas, criamos uma função para retornar o nome da transportadora no nosso vídeo (que você pode conferir no final do post). Mas agora queremos chamar a função para completar os dados de nossa base em Excel.
Para isso, usamos o apply(). O apply() “aplica” uma função a uma coluna, linha ou célula de um dataframe no Pandas. Vamos a um exemplo simples: a função abaixo multiplica a coluna Quantidade de um dataframe por outra coluna chamada Preço Unitário.
def geraTotal(pedidos):
return pedidos["Quantidade"] * pedidos["Preço Unitário"]
Vamos importar os dados da Dr. Paçoca e usar o apply() para chamar a função geraTotal. O argumento axis do apply() indica se ele vai se orientar pelas colunas (axis=0) ou pelas linhas (axis=1).
import pandas as pd
URL = "http://profalibania.com.br/python/FinalTestKipacoca.xlsx"
pedidos = pd.read_excel(URL)
pedidos["Total"] = pedidos.apply(geraTotal, axis=1)
display(pedidos)
O apply funciona de modo simples… quando nossa função possui apenas um argumento… ☹ No nosso exemplo, a função transporte(pedidos, estado) pede dois argumentos: pedido, que é o valor total de cada linha do dataframe, e o estado, que é o destino da entrega. Para esses casos, precisamos “disfarçar” nossa função usando o lamdba.
O lambda é uma função que cria uma função anônima… 😮 Em Português, serve para empacotar cálculos e comandos em um só lugar (como qualquer função faz), mas sem precisarmos dar nome a ela. Para nós, ela servirá para “empacotar” a chama da função transporte, com seus dois argumentos, já que o apply só suporta um.
import pandas as pd
URL = "http://profalibania.com.br/python/FinalTestKipacoca.xlsx"
pedidos = pd.read_excel(URL)
pedidos['Transportadora'] = pedidos.apply(lambda x : transportadora(x.Total, x.Estado), axis=1)
Se eu der o display agora, vou ver a transportadora para cada pedido!
Projeto Original
Você pode conferir o projeto original no vídeo abaixo: