我正在开发一个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 |
逻辑和提供的输出不清楚。
我的猜测是,您可能希望将
df1
中的日期和 df2
中的值组合起来,然后填充缺少的组合以使每个日期都具有两种类型。
如果是这种情况,您可以使用:
out = (pd.merge_asof(df2, df1, left_on='date2', right_on='date1',
by='Type', direction='nearest')
.pivot_table(index='Type', columns='date1', values='value2', fill_value=0)
.rename_axis(columns='Date')
.unstack().reset_index(name='Value')
)
输出:
Date Type Value
0 2021-01-01 Labor 10.0
1 2021-01-01 Material 0.0
2 2021-02-01 Labor 0.0
3 2021-02-01 Material 20.0
4 2021-03-01 Labor 25.0
5 2021-03-01 Material 0.0
6 2021-04-01 Labor 0.0
7 2021-04-01 Material 45.0
请注意,这些值略有不同。