Já expliquei essa função outras vezes, mas talvez chamá-la de PROCV (ou VLOOKUP para quem usa Excel em inglês) ajuda as pessoas a compreendê-la. O post de hoje é dedicado a ensinar como fazer a famosa função PROCV do Excel no Python.
Posto de outra forma, imagine que você tenha duas bases, onde em uma tenha a informação de idade e cpf das pessoas. Tal como é mostrado abaixo:
import pandas as pd # Cadastro da loja cadastro = {'CPF': ['00000000000','11111111111','22222222222'], 'Nome': ['Andre', 'Amanda', 'Bruna'], 'Idade': [20,35,40] } cadastro = pd.DataFrame(cadastro, columns = ['CPF','Nome','Idade']) cadastro
Porém, as informações de CEP não estão com sua área. Um colega então lhe envia a base abaixo, contendo o CEP de vários clientes:
# base de CEP cep = {'CPF': ['00000000000','97979797979','58585858585','11111111111','22222222222'], 'CEP': ['00000000', '55555555', '77777777', '88888888', '99999999'] } cep = pd.DataFrame(cep, columns = ['CPF','CEP']) cep
E agora? Como trazer a informação de CEP para a sua base de cadastro?
Bom, quem já mexeu com Excel – que é quem provavelmente está aqui – sabe que a função PROCV faz isso. Basta você indicar qual o campo em comum das duas bases e a informação que você quer trazer. Aqui, é igual. O nome da função em questão é o merge(), e a sintaxe é a seguinte:
pd.merge(tabela_1, tabela_2, on=['campo_em_comum'], how='left')
No nosso caso, teríamos:
pd.merge(cadastro, cep, on=['CPF'], how='left')
Ok, aí algumas dúvidas devem ter surgido. Por exemplo, e se você tiver dois campos em comum? E se você não quiser trazer todos os campos da tabela_2?
No primeiro caso, é simples, a sintaxe ficaria:
pd.merge(tabela_1, tabela_2, on=['campo_em_comum_1', 'campo_em_comum_2'], how='left')
Para o caso de você não querer trazer todas as colunas, basta você filtrar os campos que você quer da tabela. Lembre-se de colocar colchetes duplos, pois no caso de você colocar só um, o Python vai entender que a combinação de campos é o nome da coluna:
pd.merge(tabela_1, tabela_2[['campo_1', 'campo_2',...,'campo_n']], on=['campo_em_comum_1', 'campo_em_comum_2'], how='left')
E aí? Gostou do conteúdo? Se inscreva para receber todas as novidades. Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e, principalmente, compartilhar com seus amigos. De verdade, isso faz toda a diferença. Além disso, você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @UniDosDados ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal Universidade dos Dados. E se você gosta de tecnologia, escute o podcast Futuristando!
Bons estudos!
olá estou com dificuldade num problema parecido…
eu quero, atraves de um comando input, fazer ele digitar um nome, com esse nome eu quero que ele busque numa lista o peso relacionado a pessoa e a altura, e no fim ele me imprima o peso e a altura da pessoa…
ex:
nome input(‘Digite o nome do cliente: ‘)
#faça ele busca na lista esse nome e as informaçoes relacionadas a ele, e no fim
print(‘Cliente {} ,com altura {} esta pesando {}’)
se puder ajuda agradeço… ainda sou iniciante em python e nao conheco muitos comandos…
Olá, Rodrigo.
Partindo do pressuposto de que o valor da altura está numa coluna chamada altura, de que o valor do peso está numa coluna peso, o que está te faltando para obter essa informação é entender como localizar a informação utilizando o loc e como usar o f-string para trabalhar com variáveis. Veja um exemplo simples com o dataset iris:
import pandas as pd
iris = pd.read_csv(‘iris.csv’)
id = input(“Digite o id da flor: “)
print(f”A planta {iris.loc[iris[‘Id’] == int(id), ‘Species’].iloc[0]}, com largura de sepala {iris.loc[iris[‘Id’] == int(id), ‘SepalWidthCm’].iloc[0]} é da espécie {iris.loc[iris[‘Id’] == int(id), ‘SepalWidthCm’].iloc[0]}”)
Utilizamos o loc para passar o número da linha e o nome da coluna na qual está o elemento que queremos trazer. Porém, se não fizermos iloc[0] traremos o índice também (algo que não queremos printar).
Já o f-string serve para trazer campos variáveis. Faça alguns testes e veja se entendeu o funcionamento de ambos.
Agora, vamos supor que você tenha as informações num dataframe, uma tabela, chamada df, onde a coluna nome contém o nome do indivíduo, a coluna altura contém a altura, e a coluna chamada peso contém o peso. Você quer então fazer algo assim:
nome = input(“Digite o nome do cliente: “)
print(f”Cliente {df.loc[df[‘nome’] == str(nome), ‘nome’].iloc[0]} ,com altura {df.loc[df[‘nome’] == str(nome), ‘altura’].iloc[0]} esta pesando {df.loc[df[‘nome’] == str(nome), ‘peso’].iloc[0]}”)
Espero que tenha ajudado e peço desculpas pela demora.
Abraços!
Olá, primeiramente obrigado por compartilhar seu conhecimento. Eu criei uma coluna estado na base de CEP e tentei fazer um merge trazendo somente a coluna estado, porém não deu certo, aparece uma mensagem de erro.
Estou usando o google colab, segue a parte que modifiquei baseado na sua informação. Se puder ajudar, agradeço.
import pandas as pd
# Cadastro da loja
cadastro = {‘CPF’: [‘00000000000′,’11111111111′,’22222222222’],
‘Nome’: [‘Andre’, ‘Amanda’, ‘Bruna’],
‘Idade’: [20,35,40]
}
cadastro = pd.DataFrame(cadastro, columns = [‘CPF’,’Nome’,’Idade’])
cadastro
# base de CEP
cep = {‘CPF’: [‘00000000000′,’97979797979′,’58585858585′,’11111111111′,’22222222222’],
‘CEP’: [‘00000000’, ‘55555555’, ‘77777777’, ‘88888888’, ‘99999999’],
‘Estado’: [‘SP’, ‘RJ’, ‘SC’, ‘MG’, ‘TO’]
}
cep = pd.DataFrame(cep, columns = [‘CPF’,’CEP’,’Estado’])
cep
pd.merge(cadastro, cep[‘Estado’], on=[‘CPF’], how=’left’)