1
resposta

dúvida merge

Suponha os seguintes quatro dataframes abaixo (e também neste link do GoogleColab):

Janeiro = {'DS_NOME_SERVIDOR': 'Rubens Braga', 'NR_MATRICULA':23420, 'CD_RUB':31420, 'VALOR': 21916.94}
Fevereiro = {'DS_NOME_SERVIDOR': 'Rubens Braga', 'NR_MATRICULA':23420, 'CD_RUB':31420, 'VALOR': 21886.00}
Marco = {'DS_NOME_SERVIDOR': 'Rubens Braga', 'NR_MATRICULA':23420, 'CD_RUB':31440, 'VALOR': 21916.94}
Abril = {'DS_NOME_SERVIDOR': 'Rubens Braga', 'NR_MATRICULA':23420, 'CD_RUB':31440, 'VALOR': 21886.00}

Considere que:

  • 'DS_NOME_SERVIDOR': Nome do empregado
  • 'NR_MATRICULA': Matricula do empregado
  • 'CD_RUB': Código que identifica o valor pago e descontado (31420 é quando é pago e 31440 é quando é descontado)

Eu quero fazer uma busca que me retornem valores pagos e descontados dentro de uma janela de 3 meses, como a seguir:

Janela "Janeiro, Fevereio e Março". No mes de Janeiro consta que ele recebeu 21916.94 e que no mes de Fevereiro ele recebeu 21886.00 (ambos CD_RUB == 31420). Já em Março ele devolveu 21916.94 (CD_RUB == 31440). Ou seja, ele possui um débito de 21886.00 (Já que esse valor não foi devolvido).

Janela "Fevereiro, Março e Abril" Nesse período, ele recebeu 21886.00 em Fevereiro; em Março ele devolveu 21916.94 e em Abril devolveu 21886.00. Logo, há um valor devolvido a mais nessa Janela, que é o de 21916.94 que eu quero que me retorne.

O que eu tentei fazer

#variável que armazena os dataframes das janelas mes_adiantamento = Janeiro mes_intervalor = Fevereiro mes_devolucao = Marco

#Aqui eu pego os meses da janela considerada e filtro pelas rubricas de adiantamento e de devolução
adiantamento = mes_adiantamento.query("CD_RUB  == 31420")
devolucao_mes_intervalo = mes_intervalo.query("CD_RUB == 3144")
devolucao_mes_devolucao = mes_devolucao.query("CD_RUB == 3144")

#concateno em um novo dataframe apenas o que é devolvido
mes_intervalo_devolucao = pd.concat([devolucao_mes_intervalo, devolucao_mes_devolucao], axis=0, join='outer')

#faço um merge entre o que foi adiantado, dataframe "adiantamento" Janeiro, e o que foi devolvido, dataframe "mes_intervalo_devolucao". Nesse exemplo, adiantamento é Janeiro, e mes_intervalo_devolucao armazena a concatenação de Fevereiro e Março.
ferias_nao_devolvidas = pd.merge(adiantamento, mes_intervalo_devolucao, on=['NR_MATRICULA'], how='left')

A partir daqui eu já não sei como prosseguir. Nem mesmo sei se estou indo no caminho certo, já que não retorna o resultado pretendido. Segue o ambiente de testes no colab: https://colab.research.google.com/drive/1HO8xeRxQG93vnpj3fGIAZ3_W4qCCjMhM?authuser=1#scrollTo=JFSy4I6ri-kP

1 resposta

Olá, Rogério. Tudo bem?

Não sei se entendi bem o que você deseja fazer, mas pensei em algumas coisas.

Primeiro, que tal colocar os meses como uma chave no dicionário?

Dessa forma, você não precisa criar um dicionário diferente para cada mês e também é possível unificar tudo num só dicionário.

O código a seguir mostra o novo dicionário atualizado:

dados = {'DS_NOME_SERVIDOR': ['Rubens Braga', 'Rubens Braga', 'Rubens Braga', 'Rubens Braga'], 'NR_MATRICULA':[23420, 23420, 23420, 23420], 'CD_RUB': [31420, 31420, 31440, 31440], 'VALOR': [21916.94, 21886.00, 21916.94, 21886.00], 'MES': ['Janeiro', 'Fevereiro', 'Março', 'Abril']}

Agora, vamos criar nosso DataFrame:

df_servidor = pd.DataFrame(dados)
df_servidor

Saída:

DS_NOME_SERVIDORNR_MATRICULACD_RUBVALORMES
0Rubens Braga234203142021916.94Janeiro
1Rubens Braga234203142021886.00Fevereiro
2Rubens Braga234203144021916.94Março
3Rubens Braga234203144021886.00Abril

O próximo passo seria criar uma lista dos meses selecionados, que você pode ver no código a seguir:

meses_intervalo = ['Janeiro', 'Fevereiro', 'Abril']

Agora, vamos utilizar a query com os meses que queremos:

df_meses = df_servidor.query(f'MES == {meses_intervalo}')
df_meses

Saída:

DS_NOME_SERVIDORNR_MATRICULACD_RUBVALORMES
0Rubens Braga234203142021916.94Janeiro
1Rubens Braga234203142021886.00Fevereiro
3Rubens Braga234203144021886.00Abril

Assim, você tem os dados para os meses que deseja.

Para procurar as informações específicas através dos códigos que informam se foi pago ou descontado, basta realizar uma query no DataFrame df_meses que acabamos de criar:

df_pago = df_meses.query('CD_RUB == 31420')
df_pago

Saída:

DS_NOME_SERVIDORNR_MATRICULACD_RUBVALORMES
0Rubens Braga234203142021916.94Janeiro
1Rubens Braga234203142021886.00Fevereiro

Para as outras informações, basta mudar a busca.

Era essa a ideia que você tinha em mente?

 

Espero ter ajudado, Rogério. Se tiver mais alguma dúvida, estou à disposição. Bons estudos =)

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