如果多列中的值与另一个数据框匹配,则根据日期范围获取总和 pandas

If values in multiple columns match another dataframe, get sum based on range of dates pandas

我有两个dfs:

df1:

    item_code   store_code  start_1      end_1
0   11185      01           2022-03-06   2022-03-08
1   11185      02           2022-03-26   2022-03-28
2   118113     01           2022-02-02   2022-02-04
3   118113     02           2022-04-29   2022-04-30
4   118113     02           2022-05-01   2022-05-02
5   000544     01           2022-04-15   2022-04-17

df2:

    item_code       store_code  date_code   sales_sum
0   11185            01         2022-03-06  1.5
1   11185            01         2022-03-07  1.0
2   11185            01         2022-03-08  1.0
4   11185            02         2022-03-25  1.5
5   11185            02         2022-03-26  1.5
6   11185            02         2022-03-27  2.0
7   11185            02         2022-03-28  2.0
8   118113           01         2022-02-02  2.0
9   118113           01         2022-02-03  2.0
10  118113           01         2022-02-04  2.0
11  118113           02         2022-02-05  3.0
12  118113           02         2022-04-29  3.0
13  118113           02         2022-04-30  3.0
14  118113           02         2022-05-01  5.0
15  118113           02         2022-05-02  5.0
16  000544           01         2022-04-16  7.0

我想做的是,如果 item_codestore_codedf1 相同,则获取 sales_sum.sum(),在日期范围内 (start = start_1, end = end_1).

预期输出应为:

    item_code   store_code  start_1      end_1        sales_sum
0   11185      01           2022-03-06   2022-03-08   3.5
1   11185      02           2022-03-26   2022-03-28   5.5
2   118113     01           2022-02-02   2022-02-04   6.0
3   118113     02           2022-04-29   2022-04-30   6.0
4   118113     02           2022-05-01   2022-05-02   10.0
5   000544     01           2022-04-15   2022-04-17   7.0

我尝试做的事情没有任何效果,例如 .sum() 条件 & 或在字典中创建多个 dfs 以申请 item_code 和 [=19 的每个块=] 日期范围。

df1 的大小:33667 行,以及 df2 的大小:4408248 行

您可以使用 mergequery:

out = (df1.merge(df2, how='left', suffixes=('', '_'))
          .query('(start_1 <= date_code) & (date_code <= end_1)')
          .groupby(df1.columns.tolist(), as_index=False, sort=False)
          ['sales_sum'].sum())
print(out)

# Output
  item_code store_code     start_1       end_1  sales_sum
0     11185         01  2022-03-06  2022-03-08        3.5
1     11185         02  2022-03-26  2022-03-28        5.5
2    118113         01  2022-02-02  2022-02-04        6.0
3    118113         02  2022-04-29  2022-04-30        6.0
4    118113         02  2022-05-01  2022-05-02       10.0
5    000544         01  2022-04-15  2022-04-17        7.0