Как насчет игры с индексами?
Предположим, у вас есть данные в pandas.DataFrame
под названием data
data = data.set_index(["Country", "Column1", "Week", "Product"], drop=False)
df1 = data[data.Product == "A"].set_index(["Country", "Column1", "Week"], drop=False)
df2 = data[data.Product == "B"].set_index(["Country", "Column1", "Week"], drop=False)
df2.Val += df1.Val * .5 # so that rows with all else the same would add
df2 = df2.set_index(["Country", "Column1", "Week", "Product"])
data.update(df2)
data["Index"] = range(len(data.Val))
data = data.set_index("Index")
data.index.name = None
Я думаю, что преимущество этого подхода в том, что он полностью соответствуетваши требования и достижения результата на месте .Это производит
Country Column1 Product Week Val
0 UK S1 A 2019-36 10.0
1 UK S1 A 2019-37 20.0
2 UK S1 A 2019-38 30.0
3 UK S1 B 2019-36 35.0
4 UK S1 B 2019-37 40.0
5 UK S1 B 2019-38 45.0
6 DE S1 A 2019-39 100.0
7 DE S1 A 2019-40 100.0
8 DE S1 A 2019-41 100.0
9 DE S1 B 2019-36 10.0
10 DE S1 B 2019-37 15.0
11 DE S1 B 2019-38 10.0