如果多列中的值与另一个数据框匹配,则根据日期范围获取总和 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_code
和 store_code
与 df1
相同,则获取 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 行
您可以使用 merge
和 query
:
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
我有两个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_code
和 store_code
与 df1
相同,则获取 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 行
您可以使用 merge
和 query
:
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