我正在开发一个Python解决方案来应对数据转换挑战,并且遇到了一个我似乎无法解决的小障碍。我想合并两个数据框(即 df1 和 df2)以创建一个新的数据框,该数据框已将 df2['value2'] 插入 df1['value1'],同时考虑日期和“类型”对齐。有没有人解决过类似的问题?pandas 是解决这个问题的最佳库吗?
请参阅我在 jupyter 笔记本中使用的代码片段,以进行下面的解决方案测试。
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)
我试图实现的输出如下所示。
类型 | 日期 | 价值 |
---|---|---|
劳动 | 2021-01-01 | 10 |
材料 | 2021-01-01 | 0 |
劳动 | 2021-02-01 | 25 |
材料 | 2021-02-01 | 20 |
劳动 | 2021-03-01 | 0 |
材料 | 2021-03-01 | 45 |
劳动 | 2021-04-01 | 0 |
材料 | 2021-04-01 | 0 |
merge_asof
是左合并,需要df1
在左边使用。您还必须将月份用作by
:输出:
中间体: