Pandas 在最近的日期合并并考虑分组

问题描述 投票:0回答:1

我正在开发一个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
python pandas
1个回答
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

请注意,这些值略有不同。

© www.soinside.com 2019 - 2024. All rights reserved.