Estou desenvolvendo uma solução python para um desafio de transformação de dados e estou enfrentando um pequeno obstáculo que não consigo entender. Quero mesclar os dois quadros de dados (ou seja, df1 e df2) para criar um novo quadro de dados que tenha inserido df2['value2'] em df1['value1'] enquanto considera o alinhamento de data e 'Tipo'. Alguém já resolveu um problema semelhante? O pandas é a melhor biblioteca para resolver este problema?
Consulte o trecho de código que estou usando em meu notebook Jupyter para testar a solução abaixo.
import pandas as pd
df1 = pd.DataFrame({ 'Type': ['Labor', 'Material', 'Labor', 'Material' , 'Labor', 'Material', 'Labor', 'Material'],'date1': ['2021-01-01', '2021-01-01', '2021-02-01', '2021-02-01', '2021-03-01', '2021-03-01', '2021-04-01', '2021-04-01'], 'value1': [0,0,0,0,0,0,0,0]})
df2 = pd.DataFrame({ 'Type': ['Labor', 'Material', 'Labor', 'Material'],'date2': ['2021-01-
11', '2021-02-22', '2021-02-05', '2021-03-15'], 'value2': [10,20,25,45]})
display(df1)
display(df2)
df1['date1'] = pd.to_datetime(df1['date1'])
df2['date2'] = pd.to_datetime(df2['date2'])
df1 = df1.sort_values(['date1', 'Type'])
df2 = df2.sort_values(['date2', 'Type'])
merge_df = pd.merge_asof(df2, df1, left_on= 'date2', right_on= 'date1' , by = 'Type',
direction = 'nearest')
display(merge_df)
A saída que estou tentando alcançar é visualizada abaixo.
Tipo | Data | Valor |
---|---|---|
Trabalho | 2021-01-01 | 10 |
Material | 2021-01-01 | 0 |
Trabalho | 01/02/2021 | 25 |
Material | 01/02/2021 | 20 |
Trabalho | 01/03/2021 | 0 |
Material | 01/03/2021 | 45 |
Trabalho | 01/04/2021 | 0 |
Material | 01/04/2021 | 0 |
merge_asof
é uma mesclagem à esquerda, você precisa usardf1
à esquerda. Além disso, você deve usar o mês comoby
:Saída:
Intermediários: