首页 > 解决方案 > 有条件地连接两个数据帧

问题描述

我有两个数据框,这是其中之一,它包含去年的数据:

                  col1  col2  col3  col4
Type  Date
type1 2020-01-01   1.0   2.0   3.0   4.0
      2020-02-01   1.0   2.0   3.0   4.0
      2020-03-01   1.0   2.0   3.0   4.0
      2020-04-01   1.0   2.0   3.0   4.0
      2020-05-01   1.0   2.0   3.0   4.0
type2 2020-01-01   1.0   2.0   3.0   4.0
      2020-02-01   1.0   2.0   3.0   4.0
      2020-03-01   1.0   2.0   3.0   4.0
      2020-04-01   1.0   2.0   3.0   4.0
      2020-05-01   1.0   2.0   3.0   4.0
type3 2020-01-01   1.0   2.0   3.0   4.0
      2020-02-01   1.0   2.0   3.0   4.0
      2020-03-01   1.0   2.0   3.0   4.0
      2020-04-01   1.0   2.0   3.0   4.0
      2020-05-01   1.0   2.0   3.0   4.0
type4 2020-01-01   1.0   2.0   3.0   4.0
      2020-02-01   1.0   2.0   3.0   4.0
      2020-03-01   1.0   2.0   3.0   4.0
      2020-04-01   1.0   2.0   3.0   4.0
      2020-05-01   1.0   2.0   3.0   4.0
type5 2020-01-01   1.0   2.0   3.0   4.0
      2020-02-01   1.0   2.0   3.0   4.0
      2020-03-01   1.0   2.0   3.0   4.0
      2020-04-01   1.0   2.0   3.0   4.0
      2020-05-01   1.0   2.0   3.0   4.0

另一个是新数据:

                  col1  col2  col3  col4
Type  Date
type1 2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type2 2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type3 2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type4 2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type5 2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0

如您所见,不同的只是日期和值。我每天都创建这个新数据,并且我想在某些条件下连接这两个数据帧。我想在这里看看去年的值进行比较。例如,由于我们目前是 2021 年 1 月,我只想在此处添加 2020 年 1 月的数据。当日期为 2 月时,此数据框不应再包含 2020 年 1 月的数据,而应仅包含 2020 年 2 月的数据。但是,我在这里添加所需的输出:

When the date is January 2021:

                  col1  col2  col3  col4
Type  Date
type1 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type2 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type3 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type4 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type5 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0

这样做的方法是什么?

标签: pandasconcatenation

解决方案


想法是将实际时间转换为月份周期Timestamp.to_period,减去上一年的 12 并通过筛选第二级Date选择Index.get_level_values并转换为周期DatetimeIndex.to_period

now = pd.to_datetime('now').to_period('m') - 12

df11 = df1[ df1.index.get_level_values('Date').to_period('m') == now]
print (df11)
                  col1  col2  col3  col4
Type  Date                              
type1 2020-01-01   1.0   2.0   3.0   4.0
type2 2020-01-01   1.0   2.0   3.0   4.0
type3 2020-01-01   1.0   2.0   3.0   4.0
type4 2020-01-01   1.0   2.0   3.0   4.0
type5 2020-01-01   1.0   2.0   3.0   4.0

最后添加到第二个 DataFrameconcat并排序MultiIndex

df3 = pd.concat([df11, df2]).sort_index()
print (df3)
                  col1  col2  col3  col4
Type  Date                              
type1 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type2 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type3 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type4 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0
type5 2020-01-01   1.0   2.0   3.0   4.0
      2021-01-01  10.0  20.0  30.0  40.0
      2021-02-01   0.0   0.0   0.0   0.0
      2021-03-01   0.0   0.0   0.0   0.0
      2021-04-01   0.0   0.0   0.0   0.0
      2021-05-01   0.0   0.0   0.0   0.0

推荐阅读